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,但被引用的实体不知道它是从哪里引用的。

如何做到这一点?

NHibernate自指多对多;向上引用”;

这真的没有我最初想象的那么难。可以使用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将不时过期。