NHibernate自指多对多;向上引用”;
本文关键字:引用 NHibernate | 更新日期: 2023-09-27 18:21:32
我想使用NHibernate实现一个"角色"结构(不是Fluent,我喜欢XML映射…)。到目前为止,它的工作原理是将角色作为一组权限(枚举)映射(作为字符串)。
但现在的下一个要求是,角色需要一种通用的方法来确定他们可以授予用户哪些其他角色。
因此,"管理员角色"将被允许向用户授予任何其他角色。"主持人角色"只允许将角色"超级用户"分配给用户,而"用户角色"没有任何可以授予的角色。
我认为最简单的方法是创建另一个集合,这次将类型Role
改为现有的Role
,如下所示:
public class Role
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ISet<Permission> Permissions { get; set; }
public virtual ISet<Role> GrantableRoles { get; set; }
public Role()
{
Permissions = new HashedSet<Permission>();
GrantableRoles = new HashedSet<Role>();
Name = string.Empty;
}
public virtual bool HasPermission(Permission permission_)
{
return Permissions.Contains(permission_);
}
public virtual bool CanGrant(Role role_)
{
return GrantableRoles.Contains(role_);
}
}
问题是:如何将其映射到Role.hbm.xml
文件中?我想它应该是many-to-many
关系,但据我所知,这种类型总是需要一个"向上引用",即:角色知道可以授予哪些角色。
这是一个不必要的信息,(imho)角色不应该知道。
这就是为什么我需要某种many-to-many
,但被引用的实体不知道它是从哪里引用的。
如何做到这一点?
这真的没有我最初想象的那么难。可以使用set
:
<set name="GrantableRoles" table="role_grants" lazy="false">
<key column="grantingRole"/>
<many-to-many class="Core.Model.Role,Core" column="grantableRole" />
</set>
注意:lazy=false
已经完成,因此可授予的角色始终存在,这可能只与我的情况相关,因为我必须将角色保存在应用程序的HttpSession
中,如果我使用lazy=true
这样做,NHibernateSession
将不时过期。