2012-01-14 38 views
3

我有这种情况,不能真正起作用。基本上,我有抽象类User和扩展类Admin,TeacherLabEmployee。这里是我的映射:作为NHibernate鉴别器的C#字符串枚举

<class name="User" table="users" dynamic-update="true" dynamic-insert="true" select-before-update="false"> 
<id name="Id"> 
    <column name="id" sql-type="bigint"/> 
    <generator class="identity"/> 
</id> 
<discriminator column="user_type" type="String"/> 
... 
some irrelevant properties (username, password, email etc.) 
... 
<subclass name="Admin" discriminator-value="ADMIN"/> 
<subclass name="LabEmloyee" discriminator-value="LABEMPLOYEE"/> 
<subclass name="Teacher" discriminator-value="TEACHER"/> 
</class> 

现在,我真的想使用此枚举

public enum UserType 
{ 
    ADMIN, LABEMPLOYEE, TEACHER 
} 

据我所知,NHibernate的默认地图枚举为整数所以ADMIN将是“0”,LABEMPLOYEE会“1”和TEACHER将是“2”。我尝试以下这篇文章:

http://codebetter.com/jefferypalermo/2006/03/14/using-enum-strings-with-nhibernate-persistence-level-400/

...和定义UserTypeWrapper:

public class UserTypeWrapper: NHibernate.Type.EnumStringType 
{ 
    public UserTypeWrapper() 
     : base(typeof(User.UserType)) 
    { 
    } 
} 

...但它假定枚举不鉴,那就是,我不能设置鉴别输入为UserTypeWrapper,因为NHibernate会抛出MappingException“无法确定UserTypeWrapper的类型”。

有谁知道如何做到这一点?

任何帮助将不胜感激!谢谢!

回答

5

鉴别器值无处可见的类为此你不需要任何usertype从数据库转换为属性。在HBM中,你也不能使用枚举,你必须直接在discriminator-value=""中写入值。你想要的可能是:

abstract class User 
{ 
    public virtual UserType Type { get; protected set;} 
} 

class Teacher : User 
{ 
    public Teacher() 
    { 
     Type = UserType.Teacher; 
    } 
} 

class LabEmployee : User 
{ 
    public LabEmployee() 
    { 
     Type = UserType.LabEmployee; 
    } 
} 

switch(someuser.Type) 

或使用常规

abstract class User 
{ 
    public virtual UserType Type { get; protected set;} 

    public User() 
    { 
     Type = Enum.Parse(typeof(UserType), this.GetType().Name); 
    } 
} 

,并使用约定的映射以及价值(流利NHibernate的约定来指定识别器值)

public class DiscriminatorValueConvention : ISubclassConvention 
{ 
    public void Apply(ISubclassInstance instance) 
    { 
     instance.DiscriminatorValue(instance.EntityType.Name); 
    } 
}