Критерии NHibernate объединяют множество значений enum - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть один класс с именем User и в этом классе коллекция UserRole значений перечисления.

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

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

Отношение User к UserRole является отношением «многие ко многим» и реализовано с тремя таблицами (tblUser, tblRole и tblUserRole, имеющие только userId и roleId). 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?

Заранее спасибо за подсказки.

1019 * MRKS *

1 Ответ

0 голосов
/ 07 декабря 2011

у вас уже есть перечисление flags, которое в основном уже является набором значений.Для этого вам даже не нужны таблицы UserRoles и Roles, достаточно простого столбца в User *

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

public virtual UserRoles Roles { get; private set; }

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

Если вы действительно хотите что-то вроде:

<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>
...