2012-01-14 7 views
3

私は実際には動作しないこのケースを持っています。基本的に抽象クラスUser、拡張クラスAdminTeacherLabEmployeeがあります。ここに私のマッピングは、次のとおりです。今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> 

が、私は本当にこの列挙型を使用したい

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

...しかし、列挙型はつまり、私は弁別を設定することはできません、弁別ではないことを前提としていNHibernateがMappingExceptionをスローするとUserTypeWrapperとタイプしてください: "UserTypeWrapperの型を決定できませんでした"。

これを達成する方法を知っている人はいますか?

ご協力いただければ幸いです!ありがとう!

答えて

5

ここで、ディスクリミネータの値はクラスのどこにも見当たらず、dbからプロパティに変換するためのユーザタイプは必要ありません。あなたは列挙型を使用することもできません。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); 
    } 
} 
関連する問題