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 {

我正在使用NHibernate符合映射。我已经为我的各种集合属性使用了
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>