【问题标题】:FLuent nHibernate Linq QueryFluent nHibernate Linq 查询
【发布时间】:2011-07-28 11:57:54
【问题描述】:

我面临使用 nHibernate 和 LINQ 访问桥接表以获取值的问题。 我有 4 个表,ROLES、MODULES、PERMISSIONS 和 RoleModulePermission(bridge)。

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

我想根据 ROLEID 获得对 ROLES 应用的 Modules n Permission。

角色映射

  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 中假设“AllowAccess” 如何做到这一点?

谢谢

【问题讨论】:

  • 你映射的类是什么样子的?
  • 映射添加到问题

标签: asp.net-mvc linq nhibernate fluent-nhibernate


【解决方案1】:

FluentNHibernate 中的三元关联映射取决于您的场景和域模型的具体情况。

基本上,如果你要在任何地方都有 多对多 关系(即你的模块可以有多个权限,角色可以有多个权限,角色可以有多个模块),你'需要有一个单独的关系实体,称为RoleModulePermission。它会将您的图形从三角形(3 个类)更改为星形(4 个具有共同“根”的类)。新实体将具有三个 多对一 关系,RoleModulePermission 将与 RoleModulePermission 具有 一对多 关系.设置级联,您可以尝试像查询其他模型一样查询此模型:

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

如果您的模型受到更多限制,即您有一些约束,您可以尝试使用AsTernaryAssociationAsEntityMap 进行更简单的映射,这几乎是相同的。然后在你的RoleModulePermission 类中,你应该有IDictionary&lt;TFrom, To&gt; 类型的关系。这可能意味着权限 X 将角色 Y 映射到模块 Z,但这意味着在权限 X 中角色 Y 没有其他模块。在 POCO 类中是这样的:

 public virtual IDictionary<Role, Module> RoleModules { get; set; }

在映射中像这样:

HasManyToMany(x => x.RoleModules).Table("tblRolesPermissions").AsEntityMap();

确实支持它,但是。您必须在关系的每一侧指定 一对多多对多 关系(在 POCO 中,RolesModules 和 @987654337 @) 并像这样映射每个关系:

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

使用 LINQ 进行查询应该如下所示:

session.Query<Permission>()
    .Where(x => x.RoleModules[role] == module);

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2011-04-30
    • 2022-08-23
    相关资源
    最近更新 更多