NHibernate一致性映射使用简单类型集而不是实体集进行多对多映射
我正在使用NHibernate符合映射。我已经为我的各种集合属性使用了NHibernate一致性映射使用简单类型集而不是实体集进行多对多映射,nhibernate,collections,many-to-many,nhibernate-mapping,mapping-by-code,Nhibernate,Collections,Many To Many,Nhibernate Mapping,Mapping By Code,我正在使用NHibernate符合映射。我已经为我的各种集合属性使用了ManyToMany、OneToMany、Element和Component关系类型创建了一些复杂的映射。但我今天遇到了一个难倒我的问题 public class Permission { public virtual long PermissionId { get; set; } public virtual string Name { get; set; } } public class User {
ManyToMany
、OneToMany
、Element
和Component
关系类型创建了一些复杂的映射。但我今天遇到了一个难倒我的问题
public class Permission
{
public virtual long PermissionId { get; set; }
public virtual string Name { get; set; }
}
public class User
{
...
public virtual Set<string> Permissions { get; set; }
}
public class Group
{
...
public virtual Set<string> Permissions { get; set; }
}
公共类权限
{
公共虚拟长权限ID{get;set;}
公共虚拟字符串名称{get;set;}
}
公共类用户
{
...
公共虚拟集权限{get;Set;}
}
公共课组
{
...
公共虚拟集权限{get;Set;}
}
表Permission
包含列PermissionId
和Name
。然后是包含列UserId
和PermissionId
的表UserPermission
,以及包含列GroupId
和PermissionId
的表GroupPermission
如您所见,权限
是一个实体,用户和权限之间以及组和权限之间存在多对多关系。但是,为了便于使用用户
和组
对象,我不希望用户
和组
有一个集合
(在Conformist中使用多个
关系类型很容易实现)。我想User
和Group
拥有一组权限名。通常我会使用元素关系类型来实现这一点,除了使用连接表的多对多问题
如何映射一个简单的类型的集合,这些类型也是多对多的?如果我理解正确,我希望权限类具有用户和组的集合:(注意集合,它不是System.Collections.Generic的集合,因为nHibernate将ISet理解为Iesi.Collections.Generic.ISet
public virtual Iesi.Collections.Generic.ISet用户{get;set;}
公共虚拟Iesi.Collections.Generic.ISet组{get;set;}
在权限映射中:
<set name="Users" table="PermissionUser" lazy="true">
<key column="PermissionId"/>
<many-to-many class="User" column="UserId" />
</set>
<set name="Groups" table="PermissionGroup" lazy="true">
<key column="PermissionId"/>
<many-to-many class="Group" column="GroupId" />
</set>
类用户和组将没有任何权限集。这并不能回答我的问题,也对我没有任何帮助。我需要用户
类提供一组权限名,这样,给定用户
,我就可以在代码中检查他们是否有给定的权限。@Nickwillams:你当然可以根据用户,此查询执行以下操作:var query=session.QueryOver().JoinQueryOver(u=>u.Users)。其中(t=>t.UserId==id);IList permissions=query.List();因此,很明显,您不太了解映射,因此感谢您的否决票!。该映射确实为您提供了哪个用户拥有什么权限。我很好地理解映射,这只是一个糟糕的设计。问题是只有约300个权限,但可能有3亿或更多用户。性能问题将是惊人的使用您的方法。投票被否决是因为答案实际上并没有回答我的问题:如何在用户和组中设置一组权限名称。@Nickwillams:我的错。我现在理解您了。老实说,我没有看到您在组和用户类中设置了permissionName。我以为它已经设置好了,因此我的答案是撤销权限目前我没有想到任何解决方案,但是我确信如果你在用户和组类中拥有整个权限实体(你说你不想要),那么你就可以添加IList PermissionNames{get{return Permissions.Select(x=>x.PermissionName.ToList();}}。不知道您是否可以在不引用UserYea中的权限的情况下使用它。在几天不工作之后,我采取了不同的方法。我只是更改了支持我的模型的数据库表,以便联接表使用权限代码而不是权限ID。这样,我可以使用元素
而不是多个
。
<set name="Users" table="PermissionUser" lazy="true">
<key column="PermissionId"/>
<many-to-many class="User" column="UserId" />
</set>
<set name="Groups" table="PermissionGroup" lazy="true">
<key column="PermissionId"/>
<many-to-many class="Group" column="GroupId" />
</set>