C # String enum как дискриминатор NHibernate - PullRequest
3 голосов
/ 14 января 2012

У меня есть этот случай, который не может по-настоящему приступить к работе.По сути, у меня есть абстрактный класс 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>

Теперь я действительно хотел бы использовать этот Enum

 public enum UserType
 {
     ADMIN, LABEMPLOYEE, TEACHER
 }

Я понимаю, что Nhibernate по умолчанию отображает перечисления в целые числа, поэтому ADMIN будет "0", LABEMPLOYEE будет "1", а УЧИТЕЛЬ будет "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))
    {
    }
}

... но предполагается, что enum не является дискриминатором, чтоЯ не могу установить тип дискриминатора как UserTypeWrapper, поскольку NHibernate создает MappingException "Не удалось определить тип для: UserTypeWrapper".

Кто-нибудь знает, как этого добиться?

Любая помощь будет принята с благодарностью!Спасибо!

1 Ответ

5 голосов
/ 15 января 2012

значение дискриминатора нигде не видно в классах, так как вам не нужен какой-либо тип пользователя для преобразования из БД в свойство.в hbm вы также не можете использовать enum, вы должны записать значение непосредственно в 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);
    }
}

, а также использовать соглашение для значения в отображении (соглашение Fluent NHibernate для указания значения дискриминатора)

public class DiscriminatorValueConvention : ISubclassConvention
{
    public void Apply(ISubclassInstance instance)
    {
        instance.DiscriminatorValue(instance.EntityType.Name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...