[asp.net-mvc]流利 nHibernate Linq 查询

发布时间: 2017/3/25 12:52:06
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我面临的问题来访问桥接表获取值使用 nHibernate 和 LINQ 的 m。 我有 4 桌,角色、 模块、 权限和 RoleModulePermission(bridge)。

角色包含 ROLEID(pk),角色名
模块包含 MODULEID(pk),MODULENAME
权限包含 PERMISSIONID,PERMISSIONTYPE
RoleModulePermission 包含 ROLEID、 MODULEID 和 PERMISSIONID

我想要的模块 n 适用于 ROLEID 基于角色的权限。

enter image description here

角色映射

  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();

看来,我做错了映射中吗?

请不要假定 '接受' 在 tblRolesPermission 中如何实现这一目标呢?

谢谢你

解决方法 1:

映射为三元协会在 FluentNHibernate 取决于您的方案和域模型的细节。

基本上,如果你要有多对多关系无处不在 (即模块可以有多个权限,角色可以有多个权限和角色可以有多个模块),您需要有一个单独的实体关系,即称为 RoleModulePermission 。它将改变你的图表从三角状 (3 类) 成星状 (4 类共同"的根")。新的实体将有三个多对一关系和 RoleModulePermission 会有一到多关系到 RoleModulePermission 。设置了叶栅和你可以试试这个模型像任何其他的查询︰

session.Query<Permission>()
    .Where(x => x.RoleModules.Any(rm => rm.Module == module));

如果您的模型是更多的限制,即你有一些制约因素,你可以试着将它映射简单使用 AsTernaryAssociationAsEntityMap ,这是差不多。然后在你 RoleModulePermission 类你应该有关系的类型 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 为 RolesModulesPermission ) 和映射每个关系像这样︰

m.HasMany(x => x.RolesPermissionsModules).AsTernaryAssociation()

查询使用 LINQ 然后应该以某种方式像这样︰

session.Query<Permission>()
    .Where(x => x.RoleModules[role] == module);
官方微信
官方QQ群
31647020