2010-12-31 9 views
0

私は2つの同様のテーブル(Table1Table2)を持っていますので、共通のプロパティを持つ基本抽象クラスを作成しました。各テーブルには、レコード処理のステータスを示す列があります。この列を1つの列挙型にマップしたいと思います。異なる値への列挙のマッピング

enum RecordStatus 
{ 
    UnkownStatus, 
    NotProcessed, 
    Processed, 
} 

残念ながら、各テーブルでは、列挙型に異なる値をマッピングする必要があります。

EnumType<RecordStatus>を継承し、マッピングをセットアップした2つのコンバータ(Table1StatusConverterTable2StatusConverter)を作成しました。それは部分的に機能します。 NHibernateは両方のクラスで1つのコンバータしか使用していないため、部分的です。

このバグはありますか、それとも設計上の説明のように機能するのでしょうか?このための回避策はありますか?

 

class abstract TableBase 
{ 
    public Guid Id { get; protected set; } 
    public string Sender { get; protected set; } 
    public DateTime ReceiveTime { get; protected set; } 
    public RecordStatus Status { get; set; } 
} 

class Table1 : TableBase 
{ 
    public string Message { get; set; } 
} 

class Table2 : TableBase 
{ 
    public ICollection Parts { get; protected set; } 
} 

コンバータ:

編集: Table1StatusConverterとTable2StatusConverterが同じメソッドをオーバーライドし、瞬間は、私が

エンティティそれへのアクセスを持っていないので、私はメモリからコードを書きますしかし異なった方法で。

 
class Table1StatusConverter : EnumType<RecordStatus> 
{ 
    public override object GetValue(object enumValue) { ... } 
    public override object GetInstance(object value) { ... } 
} 

マッピング:

 

Table1.hbm.xml 
<class name="Table1" table="Table1"> 
.. 
<property name="Status" type="MyAssembly.Table1StatusConverter, MyAssembly" /> 
.. 
</class> 

Table2.hbm.xml 
<class name="Table2" table="Table2"> 
.. 
<property name="Status" type="MyAssembly.Table2StatusConverter, MyAssembly" /> 
.. 
</class> 


+1

は、我々はいくつかのマッピングファイルおよびコードを参照してくださいすることができますか? – Rippo

答えて

1

これは継承の良い使用のような音はありません。ただし、列挙型の整数値を基本クラスの保護されたフィールドとしてマップし、拡張クラスのパブリックプロパティを使用して適切な列挙型にキャストすることでこれを達成できます。

+0

しかし、ステータスがNotProcessedのアイテムのクエリはどうですか? –

0

このプロパティを明示的に上書きする必要がありますか?


class abstract TableBase 
{ 
    // ... 
    public virtual RecordStatus Status { get; set; } 
} 

class Table1 : TableBase 
{ 
    public string Message { get; set; } 
    public override RecordStatus Status { get; set; } 
} 

class Table2 : TableBase 
{ 
    public ICollection Parts { get; protected set; } 
    public override RecordStatus Status { get; set; } 
} 
関連する問題