2011-12-06 13 views
0

私はUserという名前の単一クラスを持ち、このクラスではUserRoleのenum値のコレクションを持っています。NHibernateの基準が多数の列挙型値を結合します

public class User { 
    ... 
    public ICollection<UserRole> UserRoles { get; private set; } 
    ... 
} 

[Flags] 
public enum UserRole { 
    Beginner = 1, 
    Advanced = 2, 
    Expert = 4, 
    Admin = 8 
} 

UserUserRoleの関係は3つのテーブル(tblUser、tblRole、およびユーザーIDとのみroleIdを有するtblUserRole)と多対多の関係と実行されます。 HBMは以下の通りである。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> 
    <class name="User, SampleDll" table="tblUser"> 
    ... 
    <bag name="UserRoles" table="tblUserRole" cascade="all-delete-orphan" fetch="join"> 
     <key column="UserId"/> 
     <element column="RoleId" type="UserRole, SampleDll" />  
    </bag> 
    ... 
    </class> 
</hibernate-mapping> 

は、今私がいる(使用してqueryOverまたはデタッチの基準のいずれかを、このような基準を実現することが可能です

select u.* from tblUser u 
left join tblUserRole ur on ur.UserId = u.UserId 
where ur.RoleId = @USER_ROLE 

と同じsematicsを持つ基準を作成したいです)UserRole列挙型の別個のマッピングファイルを持たずに?

ありがとうございます。

ルックス

答えて

0

すでにフラグは基本的にはすでに値のコレクションです。そのために、あなたも、あなたが本当に好きな何かをしたい場合は、単にユーザーで単純な列が

[Flags] 
public enum UserRoles { 
    Beginner = 1, 
    Advanced = 2, 
    Expert = 4, 
    Admin = 8 
} 

public virtual UserRoles Roles { get; private set; } 

<property name="Roles" column="UserRoles"/> 

十分だろう、テーブルUserRolesと役割を必要といけない:

public class User { 
    ... 
    public virtual ICollection<UserRole> Roles { get; private set; } 
    ... 
} 

public class UserRole { 
    public virtual int Id { get; set; } 

    ... 
} 

その後、

<bag name="Roles" table="tblUserRole" cascade="none"> <!-- none because Roles are somewhat static not per user --> 
    <key column="UserId"/> 
    <many-to-many column="RoleId" class="UserRole, SampleDll" />  
</bag> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="UserRole" table="Roles"> 
    <id name="Id"/> 
    <!--additional properties--> 
    </class> 
</hibernate-mapping>