NHibernate尝试在保存时将Entity强制转换为IDictionary

FP

我有一个非常简单的设置:

public class Role
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Permission> Permissions { get; set; }

    public Role()
    {
        Permissions = new HashSet<Permission>();
    }
}

public enum Permission
{
    ACCESS_USER_MANAGER, [... and many more]
}

并根据映射文件:

<class entity-name="UserManager.Model.Role" table="roles">
    <id name="Id" type="int">
        <generator class="identity" />
    </id>

    <property name="Name" column="name" type="string"/>

    <set name="Permissions" table="permissions">
        <key column="role"/>
        <element column="name" type="string"/>
    </set>

</class>

但是,当我尝试创建角色并将其保存时:

[TestMethod]
public void TestRoles()
{
    ITransaction transaction = _session.BeginTransaction();
    Role role = new Role();
    role.Name = "Test-Role";
    role.Permissions.Add(Permission.ACCESS_USER_MANAGER);
    _session.Save(role);
    transaction.Commit();
}

我有一个例外:

System.InvalidCastException:无法将类型为“ UserManager.Model.Role”的对象转换为类型为“ System.Collections.IDictionary”。

NHibernate为什么尝试将我的实体转换为IDictionary?而且,更重要的是:我该如何进行这项工作?我想念什么?

拉迪姆·科勒

我可以在这里看到三个问题。首先,您使用了与以下内容有关的映射:

4.4。动态模型

引用:

以下示例演示了使用地图(字典)的表示形式。首先,在映射文件中,必须声明一个实体名称,而不是(或附加一个)类名称:

<hibernate-mapping>
<class entity-name="Customer">
...

这就是我们在上面的映射中看到的entity-name而不是name如示例所示,如果我们使用动态,那么我们将继续:

// Create a customer
var frank = new Dictionary<string, object>();
frank["name"] = "Frank";
...
// Save customer
s.Save("Customer", frank);

看到:

5.1.3。

引用:

<class
    name="ClassName"                              (1)
    ...

(1)名称:持久类(或接口)的标准.NET类名称,包括其程序集名称。

因此,我们不能使用动态映射,而可以使用标准类映射:

// Instead of this
// <class entity-name="UserManager.Model.Role" table="roles">

// we should use this
<class name="UserManager.Model.Role" table="roles">

其次,应int使用此元素映射将Enum映射到(也用作permissionId列名以表明它应为int)

<element column="permissionId" type="UserManager.Model.Permission"/>

总结这应该是工作映射:

<class name="UserManager.Model.Role" table="roles">
    <id name="Id" type="int">
        <generator class="identity" />
    </id>

    <property name="Name" column="name" type="string"/>

    <set name="Permissions" table="permissions">
        <key column="role"/>
        //<!--<element column="name" type="string"/>-->
        <element column="permissionId" type="UserManager.Model.Permission"/>
    </set>

</class>

第三个问题可能是iesi和的交换System ISet应该是这样的:

using Iesi.Collections.Generic;
public class Role
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Permission> Permissions { get; set; }

    public Role()
    {
      //Permissions = new HashSet<Permission>();
        Permissions = new HashedSet<Permission>();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试将LazySeq强制转换为IFn时出错

来自分类Dev

尝试将Object强制转换为MapEntry时发生ClassCastException

来自分类Dev

尝试通过循环从Map提取值时,“无法将HashMap $ Entry强制转换为X”

来自分类Dev

ClassCastException:尝试迭代实体ID时,无法将Integer强制转换为Long

来自分类Dev

尝试通过循环从Map提取值时,“无法将HashMap $ Entry强制转换为X”

来自分类Dev

ClassCastException:尝试迭代实体ID时,无法将Integer强制转换为Long

来自分类Dev

Swift - 尝试将 Realm 对象列表(已保存到领域)转换为结果时出错

来自分类Dev

无法将Entity类型的对象强制转换为ActivityParty类型

来自分类Dev

当我尝试强制转换为(int?)时,指定的强制转换无效

来自分类Dev

尝试序列化avro记录时无法将B强制转换为java.nio.ByteBuffer

来自分类Dev

为什么需要将IDictionary <T,HashSet <S >>强制转换为IDictionary <T,IEnumerable <S >>?

来自分类Dev

为什么需要将IDictionary <T,HashSet <S >>强制转换为IDictionary <T,IEnumerable <S >>?

来自分类Dev

将目标强制转换为IEnumerable时,Moqing GetEnumerable失败

来自分类Dev

将Object []强制转换为ContentValues []时出错

来自分类Dev

将类型强制转换为结构指针时出错

来自分类Dev

使用sqldf时将数据帧强制转换为列表

来自分类Dev

将Object []强制转换为ContentValues []时出错

来自分类Dev

调用 acceptChanges() 时无法将 OracleWebRowSet 强制转换为 CachedRowSetImpl

来自分类Dev

在将AnyObject强制转换为NSMutableDictionary时,Swift类强制转换失败

来自分类Dev

尝试将列表转换为数组时出错[]

来自分类Dev

尝试将表转换为InnoDB时出错

来自分类Dev

尝试将Dictionary转换为DataFrame Pandas时发生ValueError

来自分类Dev

尝试将撰写文件转换为kubernetes清单时出错

来自分类Dev

尝试将日期转换为毫秒时的ParseException

来自分类Dev

Python - 尝试将 xml 转换为 csv 时出错

来自分类Dev

将IDictionary <Guid,string>转换为IEnumerable <SelectListItem>

来自分类Dev

如何将字典列表转换为IDictionary“ C#”

来自分类Dev

将IDictionary <Guid,string>转换为IEnumerable <SelectListItem>

来自分类Dev

尝试锁定到导航视图控制器时发生错误,无法强制将“ UIViewController”类型的值转换为“ UINavigationController”类型

Related 相关文章

  1. 1

    尝试将LazySeq强制转换为IFn时出错

  2. 2

    尝试将Object强制转换为MapEntry时发生ClassCastException

  3. 3

    尝试通过循环从Map提取值时,“无法将HashMap $ Entry强制转换为X”

  4. 4

    ClassCastException:尝试迭代实体ID时,无法将Integer强制转换为Long

  5. 5

    尝试通过循环从Map提取值时,“无法将HashMap $ Entry强制转换为X”

  6. 6

    ClassCastException:尝试迭代实体ID时,无法将Integer强制转换为Long

  7. 7

    Swift - 尝试将 Realm 对象列表(已保存到领域)转换为结果时出错

  8. 8

    无法将Entity类型的对象强制转换为ActivityParty类型

  9. 9

    当我尝试强制转换为(int?)时,指定的强制转换无效

  10. 10

    尝试序列化avro记录时无法将B强制转换为java.nio.ByteBuffer

  11. 11

    为什么需要将IDictionary <T,HashSet <S >>强制转换为IDictionary <T,IEnumerable <S >>?

  12. 12

    为什么需要将IDictionary <T,HashSet <S >>强制转换为IDictionary <T,IEnumerable <S >>?

  13. 13

    将目标强制转换为IEnumerable时,Moqing GetEnumerable失败

  14. 14

    将Object []强制转换为ContentValues []时出错

  15. 15

    将类型强制转换为结构指针时出错

  16. 16

    使用sqldf时将数据帧强制转换为列表

  17. 17

    将Object []强制转换为ContentValues []时出错

  18. 18

    调用 acceptChanges() 时无法将 OracleWebRowSet 强制转换为 CachedRowSetImpl

  19. 19

    在将AnyObject强制转换为NSMutableDictionary时,Swift类强制转换失败

  20. 20

    尝试将列表转换为数组时出错[]

  21. 21

    尝试将表转换为InnoDB时出错

  22. 22

    尝试将Dictionary转换为DataFrame Pandas时发生ValueError

  23. 23

    尝试将撰写文件转换为kubernetes清单时出错

  24. 24

    尝试将日期转换为毫秒时的ParseException

  25. 25

    Python - 尝试将 xml 转换为 csv 时出错

  26. 26

    将IDictionary <Guid,string>转换为IEnumerable <SelectListItem>

  27. 27

    如何将字典列表转换为IDictionary“ C#”

  28. 28

    将IDictionary <Guid,string>转换为IEnumerable <SelectListItem>

  29. 29

    尝试锁定到导航视图控制器时发生错误,无法强制将“ UIViewController”类型的值转换为“ UINavigationController”类型

热门标签

归档