我有一个非常简单的设置:
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?而且,更重要的是:我该如何进行这项工作?我想念什么?
我可以在这里看到三个问题。首先,您使用了与以下内容有关的映射:
引用:
以下示例演示了使用地图(字典)的表示形式。首先,在映射文件中,必须声明一个实体名称,而不是(或附加一个)类名称:
<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);
看到:
引用:
<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] 删除。
我来说两句