簡體   English   中英

Fluent nHibernate Linq查詢

[英]FLuent nHibernate Linq Query

我面臨使用nHibernate和LINQ訪問橋表以獲取值的問題。 我有4個表,ROLES,MODULES,PERMISSIONS和RoleModulePermission(bridge)。

角色包含ROLEID(pk),ROLENAME
模塊包含MODULEID(pk),MODULENAME
權限包含PERMISSIONID,PERMISSIONTYPE
RoleModulePermission包含ROLEID,MODULEID和PERMISSIONID

我想在ROLEID的基礎上將模塊n權限應用於ROLES。

在此處輸入圖片說明

角色映射

  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”如何實現?

謝謝

在FluentNHibernate中映射三元關聯取決於場景和域模型的具體情況。

基本上,如果您到處都具有多對多關系(即您的模塊可以具有多個權限,角色可以具有多個權限,並且角色可以具有多個模塊),則需要為關系建立一個單獨的實體,即RoleModulePermission 它將使您的圖形從三角形(3個類)變為星形(4個具有共同“根”的類)。 新實體將具有三個多對一關系,並且RoleModulePermissionRoleModulePermission 具有一對多關系。 設置級聯,您可以嘗試像查詢其他模型一樣查詢此模型:

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

如果您的模型受到更多限制,即您有一些約束,則可以嘗試使用AsTernaryAssociationAsEntityMap對其進行簡單AsEntityMap ,這幾乎是相同的。 然后,在您的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM