NHibernate中的只读已加入集合
基本情况如下。在我们的应用程序中,我们有角色和权限。角色和权限之间存在多对多关系。关键在于,用户可以直接被分配角色,或者他们可以拥有通过付费获得的角色。为了让事情变得更有趣,如果用户取消了付费服务,或者该服务过期,那么他们就不应该再担任该角色。我的问题是,我希望对任何给定用户拥有一个有效权限的(只读)集合,并且我希望能够对其进行查询。一些映射细节:NHibernate中的只读已加入集合,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,基本情况如下。在我们的应用程序中,我们有角色和权限。角色和权限之间存在多对多关系。关键在于,用户可以直接被分配角色,或者他们可以拥有通过付费获得的角色。为了让事情变得更有趣,如果用户取消了付费服务,或者该服务过期,那么他们就不应该再担任该角色。我的问题是,我希望对任何给定用户拥有一个有效权限的(只读)集合,并且我希望能够对其进行查询。一些映射细节: public ApplicationPermissionMap() { Table("CLSYS_Applicati
public ApplicationPermissionMap()
{
Table("CLSYS_ApplicationPermissions");
Id(ap => ap.ID)
.Column("ApplicationPermissionID")
.GeneratedBy.Assigned();
//...
}
public ApplicationRoleMap()
{
Table("CLSYS_ApplicationRole");
Id(role => role.ID)
.Column("ApplicationRoleID");
HasManyToMany(r => r.Permissions)
.Table("CLSYS_ApplicationRolePermissions")
.ParentKeyColumn("ApplicationRoleID")
.ChildKeyColumn("PermissionID")
.Cascade.None();
//...
}
public PaidServiceMap()
{
Table("ECOM_PaidService");
Id(ps => ps.ID)
.Column("PaidServiceID");
Component(ps => ps.Status, statusMapping =>
{
statusMapping.Map(status => status.ID)
.Column("StatusID")
.Not.Nullable();
});
HasManyToMany(ps => ps.ApplicationRoles)
.Table("ECOM_PaidServiceRoles")
.ParentKeyColumn("PaidServiceID")
.ChildKeyColumn("RoleID")
.Cascade.None();
//....
}
public UserMap()
{
Table("CLSYS_User");
Id(user => user.ID)
.Column("UserID");
HasManyToMany(user => user.Roles)
.Table("CLSYS_User_ApplicationRoles")
.ParentKeyColumn("UserID")
.ChildKeyColumn("RoleID")
.Cascade.None();
//...
}
我需要的是这样的东西(上面的UserMap的一个补充)
我希望能够像这样查询这些权限
_session.Linq<User>().Where(u => u.EffectivePermssions.Contains(somePermission) && user.SomeOtherCriteria == something);
\u session.Linq()。其中(u=>u.effectivepermissions.Contains(somePermission)和&user.SomeOtherCriteria==something);
我知道我不能直接修改这个集合,这是完全可以接受的。有人能帮我解决这个映射问题吗?作为一个短期解决方案,我创建了一个处理联合逻辑的视图,并具有以下映射:
HasManyToMany(user => user.EffectivePermissions)
.Table("VW_CLSYS_User_EffectiveApplicationPermissions")
.ParentKeyColumn("UserID")
.ChildKeyColumn("ApplicationPermissionID")
.Inverse();
这并不理想,因为我更希望在映射中为用户提供逻辑。欢迎提出任何其他建议
HasManyToMany(user => user.EffectivePermissions)
.Table("VW_CLSYS_User_EffectiveApplicationPermissions")
.ParentKeyColumn("UserID")
.ChildKeyColumn("ApplicationPermissionID")
.Inverse();