C#字符串枚举作为NHibernate鉴别器

C#字符串枚举作为NHibernate鉴别器,c#,nhibernate,enums,C#,Nhibernate,Enums,我的案子真的没法办了。基本上,我有抽象类User和扩展类Admin,Teacher和LabEmployee。以下是我的映射: <class name="User" table="users" dynamic-update="true" dynamic-insert="true" select-before-update="false"> <id name="Id"> <column name="id" sql-type="bigint"/> <g

我的案子真的没法办了。基本上,我有抽象类
User
和扩展类
Admin
Teacher
LabEmployee
。以下是我的映射:

<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>
我知道Nhibernate默认情况下会将枚举映射为整数,因此ADMIN将为“0”,LABEMPLOYEE将为“1”,TEACHER将为“2”。我试着跟随这个帖子:

。。。和定义的UserTypeWrapper:

public class UserTypeWrapper: NHibernate.Type.EnumStringType
{
    public UserTypeWrapper()
        : base(typeof(User.UserType))
    {
    }
}
。。。但它假设enum不是鉴别器,也就是说,我不能将鉴别器类型设置为
UserTypeWrapper
,因为NHibernate抛出MappingException“无法确定:UserTypeWrapper的类型”

有人知道如何做到这一点吗


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

在类中找不到鉴别器值,因此您不需要任何用户类型来将db转换为属性。在hbm中,您也不能使用枚举,必须将值直接写入
鉴别器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);
    }
}
以及对映射中的值使用约定(Fluent NHibernate约定指定鉴别器值)

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

    public User()
    {
        Type = Enum.Parse(typeof(UserType), this.GetType().Name);
    }
}
public class DiscriminatorValueConvention : ISubclassConvention
{
    public void Apply(ISubclassInstance instance)
    {
        instance.DiscriminatorValue(instance.EntityType.Name);
    }
}