顧客に多数の注文が関連付けられている場合。NHibernate を使用して Orders List を遅延ロードするにはどうすればよいでしょうか。
マッピングファイルを設定する必要があるものですか?どんな助けや例も素晴らしいでしょう。
顧客に多数の注文が関連付けられている場合。NHibernate を使用して Orders List を遅延ロードするにはどうすればよいでしょうか。
マッピングファイルを設定する必要があるものですか?どんな助けや例も素晴らしいでしょう。
クリスの提案は私がそれを行う方法ですが、実行時にそれを行いたい場合は、次のように条件のFetchmodeを怠惰に設定できます。
criteria.SetFetchMode("Orders", FetchMode.Lazy)
ここに良い記事があります:
http://blogs.chayachronicles.com/sonofnun/archive/2007/03/30/230.aspx
上記の記事から:
最も一般的なのは、単にクラスを 'lazy="true"' 属性でマークするか、マッピング宣言に 'default-lazy="true"' を配置することです。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="@core.assembly@"
default-access="nosetter.camelcase-underscore" default-lazy="true">
または
<class name="Cei.eMerge.Core.Domain.Contacts.Contact" table="Contact" lazy="true" >
エンティティの特定のコレクションを遅延ロードするには、コレクション マッピングで "lazy=true" を使用します。例えば:
<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true">
<key column="PersonID" />
<one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" />
</bag>
ここでの答えはすべて正しいですが、移行する注文が非常に多い場合は、フィルターも使用する必要があるため、すべてを読み込む必要はありません。
顧客customer=session.CreateCriteria(...) .SetFetchMode( "Orders"、FetchMode.Lazy) .UniqueResult <Customer>(); Ilist <Order>orders = session.CreateFilter(customer.Orders、 "WHERE this.OrderDate <?") .SetDateTime(...)。List();
Customer エンティティに、すべての Orders を含むプロパティが必要ですか? これはかなり大きなコレクションになると思います。
自問しなければならない質問は次のとおりだと思います:
Customer の Orders に直接アクセスする必要があるのは何回ですか?
おそらく、この場合、双方向の関連付けは必要ないでしょうか? おそらく、Customer クラスに Orders コレクションを持ちたくないでしょう。
次に、次の署名を持つメソッドを Order Repository に追加します。
IList<Order> GetOrdersForCustomer( Customer c );
しかし、これがあなたの状況に適しているかどうかはわかりません。