假设我有一个这样的数据库:
设置此选项是为了授予按角色的菜单权限。
请注意,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/