2012-02-14 24 views
3

私はこのように定義されているクラスがあります。NHibernateは:一般的な列挙型のプロパティを持つマッピングクラス

public enum CarState 
{ 
    Stopped = 1, 
    Moving = 2 
} 
public enum OrderState 
{ 
    Ordered = 1, 
    Delivered = 2 
} 

は、私は2つのタイプを持つことができます。Stateプロパティが列挙型である

public class StateMachineMetadata<T> where T: struct 
{ 
    public virtual int ID { get; protected set; } 
    public virtual T State { get; set; } 
    public virtual DateTime DateChanged { get; set; } 
} 

StateMachineMetadata<CarState>, StateMachineMetadata<OrderState> 

テーブルNHibernateを使用して?

=== ===更新

回避策一般的な部分は、インタフェースに移動できるように:

public interface IStateMachineMetadata<T> where T: struct 
{ 
    int ID { get; } 
    T State { get; set; } 
    DateTime DateChanged { get; set; } 
} 

public class StateMachineMetadataBase 
{ 
    public virtual int ID { get; protected set; } 
    public virtual DateTime DateChanged { get; set; } 
} 

public class CarStateMachineMetadata 
    : StateMachineMetadataBase, IStateMachineMetadata<CarState> 
{ 
    public virtual CarState State { get; set; } 
} 

答えて

3

、そしてここに理由です。

のは、我々はStateMachineMetadataテーブル内の2つの行を持っていると仮定しましょう:

NHibernateのは、にデシリアライズするためにどの列挙型を決定する方法を State列が両方 CarStateOrderStateにマップされている場合
ID | State | DateChanged 
1 | 1 | 2012-02-13 
2 | 1 | 2012-02-14 

、? 1つの解決策は、特定の行をどのタイプにマップするべきかをNHibernateに伝えるStateMachineMetadataテーブルに識別器列を追加することです。
例えばType識別カラム:

ID | State | DateChanged | Type 
1 | 1 | 2012-02-13 1 
2 | 1 | 2012-02-14 2 

は、第二のStateMachineMetadata<OrderState>ある間に最初の行は、StateMachineMetadata<CarState>を表すことNHibernateのに伝えます。これはNHibernateでTable per class hierarchy mappingと呼ばれます。どちらのクラスも共通の基底クラスから継承する必要があります。この場合、当然の場合はStateMachineMetadata<T>となります。

しかし、ここでは、キャッチです:NHibernateのがオープンジェネリック型でクラスをマッピングする方法がありません。その理由は、it's simply not possibleです。

ただし、NHibernate で、クローズドジェネリックでクラスをマッピングできます。それらを同じテーブルにマップすることはできません。このような設定は次のようになります。

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
      assembly="MyAssembly" 
      namespace="MyNamespace"> 
    <class name="StateMachineMetadata`1[MyNamespace.CarState]" 
      table="StateMachineMetadata_CarState"> 
     <!-- property to column mappings --> 
    </class> 

    <class name="StateMachineMetadata`1[MyNamespace.OrderState]" 
      table="StateMachineMetadata_OrderState"> 
     <!-- property to column mappings --> 
    </class> 
</hibernate-mapping> 
+0

ありがとう、エンリコ。 – Jekas

+0

@Jekasあなたの質問に答えましたか? –

+0

しかし、私はまだ解決策を探していますが、IUserTypeを使ったいくつかの回避策があるかもしれません。あるいは、具体的な型で動作する可能性もあります。 – Jekas

関連する問題