2012-01-14 4 views
3

У меня есть этот случай, который действительно не может работать. В принципе, у меня есть абстрактный класс User и расширенные классы Admin, Teacher и LabEmployee. Вот мои отображения:C# String enum как дискриминатор NHibernate

<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)) 
    { 
    } 
} 

... но это предполагает, что перечисление не дискриминатор, то есть, я не могу установить дискриминатор введите UserTypeWrapper как NHibernate throws MappingException «Не удалось определить тип для: UserTypeWrapper».

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

Любая помощь была бы принята с благодарностью! Благодаря!

ответ

5

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