我正在使用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; }
}
表 Permission
具有列 PermissionId
和 Name
列。然后是包含列UserId
和PermissionId
的表UserPermission
,以及具有列GroupId
和PermissionId
列的表GroupPermission
。
如您所见,Permission
是一个实体,用户和权限之间以及组和权限之间存在多对多关系。但是,为了便于使用 User
和 Group
对象,我不希望User
和Group
有一个Set<Permission>
(使用 Conformist 中的ManyToMany
关系类型轻松实现)。我想User
并Group
拥有一组权限名称。通常,我会使用 Element
关系类型来实现这一点,除了整个多对多使用连接表问题。
如何映射也是多对多的简单类型的集合?
如果我理解正确,我宁愿让 Permission 类具有用户和组的集合:(请注意,它不属于 System.Collections.Generic ,因为 nHibernate 将 ISet 理解为 Iesi.Collections.Generic.ISet<>
public virtual Iesi.Collections.Generic.ISet<User> Users { get; set; }
public virtual Iesi.Collections.Generic.ISet<Group> Groups { 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>
类 用户和组将没有任何一组权限。