Jov*_*vic 3 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"/>
<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>
Run Code Online (Sandbox Code Playgroud)
现在,我真的想使用这个枚举
public enum UserType
{
ADMIN, LABEMPLOYEE, TEACHER
}
Run Code Online (Sandbox Code Playgroud)
据我所知,Nhibernate默认将枚举映射到整数,因此ADMIN为"0",LABEMPLOYEE为"1",TEACHER为"2".我试过这篇文章:
...并定义了UserTypeWrapper:
public class UserTypeWrapper: NHibernate.Type.EnumStringType
{
public UserTypeWrapper()
: base(typeof(User.UserType))
{
}
}
Run Code Online (Sandbox Code Playgroud)
...但它假设enum不是鉴别器,也就是说,我不能设置鉴别器类型,UserTypeWrapper因为NHibernate抛出MappingException"无法确定类型:UserTypeWrapper".
有谁知道如何实现这一目标?
任何帮助将不胜感激!谢谢!
鉴别器值在类中没有看到,因此您不需要任何usertype来从db转换为property.在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)
Run Code Online (Sandbox Code Playgroud)
或使用惯例
abstract class User
{
public virtual UserType Type { get; protected set;}
public User()
{
Type = Enum.Parse(typeof(UserType), this.GetType().Name);
}
}
Run Code Online (Sandbox Code Playgroud)
并在映射中使用约定的值(Fluent NHibernate约定指定鉴别器值)
public class DiscriminatorValueConvention : ISubclassConvention
{
public void Apply(ISubclassInstance instance)
{
instance.DiscriminatorValue(instance.EntityType.Name);
}
}
Run Code Online (Sandbox Code Playgroud)