Отображение для троичных ассоциаций в FluentNHibernate зависит от специфики вашего сценария и модели предметной области.
По сути, если вы собираетесь иметь отношения многие-ко-многим везде (то есть ваш модуль может иметь несколько разрешений, роль может иметь несколько разрешений и роль может иметь несколько модулей), вы будете иметь необходимо иметь отдельную сущность для отношения, называемую RoleModulePermission
. Это изменит ваш граф с треугольной (3 класса) на звездную (4 класса с общим «корнем»). Новая сущность будет иметь три отношения многие-к-одному , а Role
, Module
и Permission
будут иметь отношение один-ко-многим к RoleModulePermission
. Настройте каскады, и вы можете попробовать запросить эту модель, как и любую другую:
session.Query<Permission>()
.Where(x => x.RoleModules.Any(rm => rm.Module == module));
Если ваша модель более ограничена, то есть у вас есть некоторые ограничения, вы можете попытаться отобразить ее проще, используя AsTernaryAssociation
или AsEntityMap
, что в значительной степени совпадает. Тогда в ваших Role
, Module
и Permission
классах вы должны иметь отношение типа IDictionary<TFrom, To>
. Это может означать, что разрешение X отображает роль Y в модуль Z, но это означает, что в разрешении X роль Y не имеет других модулей. Примерно так в классе POCO:
public virtual IDictionary<Role, Module> RoleModules { get; set; }
и вот так в отображении:
HasManyToMany(x => x.RoleModules).Table("tblRolesPermissions").AsEntityMap();
поддерживает, но. Необходимо указать отношения «один ко многим» или «многие ко многим» на каждой стороне отношения (в POCO для Roles
, Modules
и Permission
) и сопоставьте каждое отношение так:
m.HasMany(x => x.RolesPermissionsModules).AsTernaryAssociation()
Запрос с использованием LINQ должен выглядеть примерно так:
session.Query<Permission>()
.Where(x => x.RoleModules[role] == module);