2010-08-16 111 views
0

这里是基本情况。在我们的应用程序中,我们拥有角色和权限。角色和权限之间存在多对多的关系。值得注意的是,用户可以直接分配角色,或者他们可以通过支付服务获得角色。为了让事情更有趣,如果用户取消付费服务,或者过期,那么他们就不应该再扮演这个角色。我的问题是,我希望在任何给定的用户上拥有(只读)有效权限的集合,并且我希望能够对其进行查询。有些映射的详细信息:只读加入收藏NHibernate

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

     //... 

    } 

需要什么是这样的(一个除了以上用户映射)

public UserMap() 
    { 
     //... 

     HasMany(user => user.EffectivePermissions) 
      //Union (user -> ApplicationRoles -> permissions) 
      //Union (user -> PaidServices [with active status] -> permissions) 
      //Distinct 
    } 

而且我希望能够在这些权限查询,像这样

_session.Linq<User>().Where(u => u.EffectivePermssions.Contains(somePermission) && user.SomeOtherCriteria == something); 

据我所知,我无法直接修改这个集合,这是完全可以接受的。任何人都可以帮我解决这个问题吗?

回答

0

作为短期解决方案,我已经创建处理该联合逻辑的图,并具有以下映射:

  HasManyToMany(user => user.EffectivePermissions) 
      .Table("VW_CLSYS_User_EffectiveApplicationPermissions") 
      .ParentKeyColumn("UserID") 
      .ChildKeyColumn("ApplicationPermissionID") 
      .Inverse(); 

这不是理想的,因为我宁愿具有在逻辑映射给用户。欢迎任何其他建议。