nhibernate - 如何在 NHibernate(不是 FluentNHibernate)中映射此类?

标签 nhibernate nhibernate-mapping

假设我有一个这样的数据库:

alt text

设置此选项是为了授予按角色的菜单权限。

请注意,User-table 与Permission-table 没有直接关系。

那么我应该如何将此类映射到数据库表?

class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public bool? IsActive { get; set; }

        public IList<Role> RoleItems { get; set; }
        public IList<Permission> PermissionItems { get; set; }
        public IList<string> MenuItemKeys { get; set; }
    }

这意味着,

(1) 每个用户都有一些角色

(2) 每个用户都拥有一些权限(取决于角色)。

(3) 每个用户都有一些允许的MenuItemKey(根据Permission)。

我的 User.hbm.xml 应该是什么样子?

最佳答案

角色和权限可能会在应用程序中被大量访问。它们很可能位于二级缓存中,这意味着我们可以期望有效地迭代 User.RoleItems 和 Role.Permissions。

这样做的优点是,我们通常可以期望在迭代这些集合时不执行任何查询。

您可以按如下方式映射类。

属性 User.PermissionItems 和 User.MenuItemKeys 派生自持久实体,因此不会出现在映射中。

<class name="User" table="user">
  <id name="ID">
    <generator class="native"/>
  </id>
  <property name="Name"/> 
  <property name="Username"/>
  <property name="Password"/>
  <property name="IsActive"/>

  <bag name="RoleItems" table="userrole" lazy="true">
    <key column="userid" />
    <many-to-many class="Role" column="roleid"/>
  </bag>
</class>

<class name="Role" table="role">
  <id name="ID">
    <generator class="native"/>
  </id>
  <property name="RoleName"/>
  <property name="IsActive"/>

  <bag name="Permissions" table="permission">
    <key column="roleid" />
    <one-to-many class="Permission"/>
  </bag>
</class>

<class name="Permission" table="permission">
  <id name="ID">
    <generator class="native"/>
  </id>
  <property name="MenuItemKey"/>
</class>

我会将 User 上的 2 个附加列表放入派生枚举中。如果它们是列表,则没有明确的方法可以插入其中,因为您无法知道该值适用于哪个角色。此外,角色不属于用户所有。

更新:现在使用迭戈的这些属性的改进版本。

class User
{
    public virtual IEnumerable<Permission> PermissionItems
    {
        get {
            return RoleItems.SelectMany(role => role.PermissionItems);
        }
    }

    public virtual IEnumerable<string> MenuItemKeys
    {
        get {
            return RoleItems.SelectMany(role => role.PermissionItems,
                        (role, permission) => permission.MenuItemKey);
        }
    }
}

关于nhibernate - 如何在 NHibernate(不是 FluentNHibernate)中映射此类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382324/

相关文章:

nhibernate - CaSTLe DynamicProxy 生成的类名

nhibernate - 与组件一起使用时,Linq to nHibernate Fetch 给出错误 "A fetch request must be a simple member access expression"

asp.net - CaSTLe Activerecord session 范围与事务范围和连接管理

c# - nHibernate,不存在具有给定标识符的行

nhibernate - nHibernate 中的 'Bag' 和 'Set' 是什么?

nhibernate - 使用 Critera 查询时仅检索特定列?

nhibernate - 如何在NHibernate中与null建立一对一的关系?

c# - 在 NHibernate 映射层中使用复杂的 where 子句

nhibernate - NHibernate Mapping-by-Code 的每个子类继承映射表

c# - 扩展 Nhibernate 以在获取或映射中使用 "inner remote join"