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

     //... 

    } 

내가 필요 무엇이이 같은 (위 UserMap 할 수있는 별도)

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

을 사용자에 대한 매핑. 다른 제안 사항은 환영합니다.