NHibernate 自引用多对多无 "up reference"

NHibernate self-referencing many-to-many without "up reference"

我想用NHibernate实现一个"role"结构(不是Fluent,我喜欢XML映射...)。到目前为止,它的工作原理是角色是一组被映射(作为字符串)的权限(枚举)。

但现在下一个要求是角色需要一种通用方法来确定他们可以授予用户哪些其他角色。

因此,"Admin role" 将被允许向用户授予任何其他角色。 "Moderator role" 只允许例如将角色 "Super user" 分配给用户,"User role" 将没有任何可以授予的角色。

我认为最简单的方法是创建另一个集合,这次将 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 关系,但据我所知,该类型总是需要一个 "up reference",即:一个角色知道它可以被哪些角色授予.

这是一个既不必要又(恕我直言)角色 应该 知道的信息。

这就是为什么我需要某种 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 会不时过期。