2009-05-05 17 views
4

私はクラスContact(基本クラス)、Customerというクラス、およびSupplierというクラスを持っています。顧客とサプライヤークラスはどちらもContactから派生しています。コレクション<T>をNHibernateにマップする方法?

お客様は注文と0..nの関係にあります。私は顧客にCollectionプロパティを持ち、それを対応するテーブルにNHibernateでマッピングしたいと思っています。

これはNHibernate(バージョン2.0.1 GA)でどのように行われますか?

(PS:.NET 3.5 SP1、VS2008 SP1を使用して)

+0

はあなたのコレクションには、注文されていますか?つまり、保存してデータベースから戻った後、同じ順序で要素を期待していますか? –

+0

コレクションはアイテムを追加した方法で保存する必要があります。 orderA、orderB、orderCを追加してもう一度読むと、orderA、orderB、orderCの順番で保持されなければなりません。 –

答えて

4

これは、次のように行われます:あなたはこれを指定し、あなたのマッピングで

public class Customer : Contact 
{ 
    private ISet<Order> _orders = new HashedSet<Order>(); 

    public Collection<Order> Orders 
    { 
     return new List<Order>(_orders); 
    } 

    // NOrmally I would return a ReadOnlyCollection<T> instead of a Collection<T> 
    // since I want to avoid that users add Orders directly to the collection. 
    // If your relationship is bi-directional, then you have to set the other 
    // end of the association as well, in order to hide this for the programmer 
    // I always create add & remove methods (see below) 

    public void AddOrder(Order o) 
    { 
     if(o != null && _orders.Contains(o) == false) 
     { 
     o.Customer = this; 
     _orders.Add(o); 
     } 
    } 
} 

は、このようなあなたのクラスを作成します。 :

<set name="Orders" table="OrdersTable" access="field.camelcase-underscore" inverse="true"> 
    <key column="..." /> 
    <one-to-many class="Order" .. /> 
</set> 

継承を使用しているため、異なるポジションNHibernateので継承マッピングに関する居住し、自分の状況に最も適した戦略を選択します。設定&バッグセマンティクスについて inheritance mapping

を: - あなたはセットとして、コレクションをマッピングするとき、あなたはすべてのことを確認することができますマップされたコレクション内のエンティティは一意です。つまり、NHibernateは、インスタンスを再構成している間、コレクションに重複が含まれないようにします。 - コレクションをバッグとしてマップすると、DBからオブジェクトをロードするときにコレクションに同じエンティティが複数回含まれる可能性があります。

  • セットは、全体として考えられる個別の オブジェクトの集合です。 A (文字の) の有効な例は{a、b、c、d}です。各文字 は正確に1回発生します。
  • バッグは、セットの一般化です。 バッグのメンバーは、 の1つのメンバーシップを持つことができ、一方、 セットの各メンバーは、1つのメンバーシップしか持たない。有効な バッグの例は、{a、a、b、c、 c、d、...}です。文字aとc はバッグに複数回出現します。
+0

あなたはもっと高速でした...継承の説明もここにあります - http://ayende.com/Blog/archive/2009/04/10/nhibernate-mapping-ndash-inheritance.aspx – Rashack

+0

私の例ではCollection を使用しています。それはまだ可能ですか? –

+0

これはまだ可能ですが、私の例では、private _ordersメンバーはセットとしてマップされているので、タイプがISetでなければなりません。 _ordersがリストなどのリストになるようにするには、それをバッグとしてマップする必要があります。 (しかし、袋のマッピングにはセッティングとセッティングの意味があります)。 公共のOrdersプロパティの戻り値の型をcollectionに変更すると、NHibernateではpublicプロパティが使用されていないがプライベートフィールドが使用されているため(この例では問題ありません)(したがってマッピングのアクセス属性) –

1

あなたはIesiコレクションこのような

public class Customer : Contact 
{ 
    public ICollection<Order> Orders 
    { 
     get; private set; 

    } 
} 

とマッピングからセットを使用することを好まない場合は、別の解決策:

<bag name="Orders" table="Customer_Orders" > 
    <key column="Customer_FK" /> 
    <composite-element> 
    <property name="OrderNumber" /> 
    <property name="OrderName" /> 
    <!-- ... --> 
    </composite-element> 
</set> 
+1

:http://feedproxy.google.com/~r/AyendeRahien/~3/etKiA3Njx-c/nhibernate-tidbit-ndash-using-ltsetgt-without-referencing-iesi.collections.aspx –

関連する問題