Роли и разрешения, вероятно, будут доступны в приложении.Скорее всего, они находятся в кэше второго уровня, а это означает, что мы можем ожидать эффективной итерации 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>
Я бы включил 2 дополнительных списка, которые вы имели в User, в производные перечисления.Если они были списками, то в них нет однозначного способа вставить их, поскольку вы не можете знать, к какой роли относится значение.Кроме того, роль не принадлежит пользователю.
Обновление: теперь используется улучшенная версия этих свойств Диего.
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);
}
}
}