2011-12-06 45 views
0

我有一個類名爲User,在這個類中的枚舉值的集合UserRoleNHibernate的標準加入了許多枚舉值

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

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

UserUserRole關係是一個多到多的關係,並用三個表(具有帳戶及角色ID僅tblUser,tblRole和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> 

現在我想建立一個標準,具有相同語義學對作爲

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

是否有可能實現這樣的標準(使用queryOver或分離標準)沒有一個單獨的映射文件UserRole enum?

在此先感謝提示。

Mrks

回答

0

你已經有了一個標誌枚舉是basicly已經值的集合。對於那些你不甚至需要表的UserRole和角色,只是在用戶簡單列就足夠了

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

public virtual UserRoles Roles { get; private set; } 

<property name="Roles" column="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>