[英]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個具有共同“根”的類)。 新實體將具有三個多對一關系,並且Role
, Module
和Permission
與RoleModulePermission
具有一對多關系。 設置級聯,您可以嘗試像查詢其他模型一樣查詢此模型:
session.Query<Permission>()
.Where(x => x.RoleModules.Any(rm => rm.Module == module));
如果您的模型受到更多限制,即您有一些約束,則可以嘗試使用AsTernaryAssociation
或AsEntityMap
對其進行簡單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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.