2010-08-16 69 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(); 

這不是理想的,因爲我寧願具有在邏輯映射給用戶。歡迎任何其他建議。