FLuent nHibernate Linq Query - PullRequest
       3

FLuent nHibernate Linq Query

0 голосов
/ 28 июля 2011

Я сталкиваюсь с проблемой доступа к таблице мостов для получения значений с помощью nHibernate и LINQ.У меня есть 4 таблицы, РОЛИ, МОДУЛИ, РАЗРЕШЕНИЯ и RoleModulePermission (мост).

Роли содержат ROLEID (pk), ROLENAMEМодули содержат MODULEID (pk), MODULENAMEРазрешение содержит PERMISSIONID, PERMISSIONTYPE
RoleModulePermission содержит ROLEID, MODULEID и PERMISSIONIDЯ хочу получить разрешение n модулей для ROLES на основе ROLEID.

enter image description here

Role Mapping

  Table("tblRoles");
        Id(role => role.RoleID).GeneratedBy.Identity();
        Map(role => role.RoleName).Not.Nullable();
        Map(role => role.IsActive).Not.Nullable();
        Map(role => role.Description).Not.Nullable();

        HasManyToMany(x => x.Users)
            .Table("tblUserInRoles")
            .ParentKeyColumn("RoleID")
            .ChildKeyColumn("UserID")
            .Not.LazyLoad();

        HasManyToMany(x => x.Modules)
            .Table("tblRolesPermission")
            .ParentKeyColumn("RoleID")
            .ChildKeyColumn("ModuleID")
            .Not.LazyLoad();

        HasManyToMany(x => x.Permissions)
            .Table("tblRolesPermission")
            .ParentKeyColumn("RoleID")
            .ChildKeyColumn("PermissionID")
            .Not.LazyLoad();

Модуль сопоставления

 Table("tblAppModules");
        Id(mod => mod.ModuleID).GeneratedBy.Identity();
        Map(mod => mod.ModuleName).Nullable();
        Map(mod => mod.CreationDate).Nullable();

        HasManyToMany(x => x.Roles)
            .Table("tblRolesPermission")
            .ParentKeyColumn("ModuleID")
            .ChildKeyColumn("RoleID")
            .Not.LazyLoad();

Разрешение сопоставления

Table("tblPermission");
        Id(p => p.PermissionID).GeneratedBy.Identity();
        Map(p => p.PermissionType).Not.Nullable();

        HasManyToMany(p => p.PermitRole)
            .Table("tblRolesPermission")
            .ParentKeyColumn("PermissionID")
            .ChildKeyColumn("RoleID")
            .Not.LazyLoad();

Похоже, я ошибся в сопоставлении?

пожалуйстане предполагайте «AllowAccess» в tblRolesPermission Как этого добиться?

Спасибо

1 Ответ

3 голосов
/ 29 июля 2011

Отображение для троичных ассоциаций в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...