NHibernate自引用多对多而没有“向上引用”

时间:2015-11-11 08:18:33

标签: c# nhibernate

我希望使用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关系,但据我所知,该类型总是需要一个“向上引用”,即:一个角色知道可以授予哪些角色

这是一个既不必要的信息,也不是应该知道的角色。

这就是为什么我需要某种many-to-many,但没有被引用的实体知道引用它的位置。

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

它真的没有我原先想象的那么难。可以使用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会不时到期。