4

顧客に多数の注文が関連付けられている場合。NHibernate を使用して Orders List を遅延ロードするにはどうすればよいでしょうか。

マッピングファイルを設定する必要があるものですか?どんな助けや例も素晴らしいでしょう。

4

5 に答える 5

7

クリスの提案は私がそれを行う方法ですが、実行時にそれを行いたい場合は、次のように条件のFetchmodeを怠惰に設定できます。

criteria.SetFetchMode("Orders", FetchMode.Lazy)
于 2009-03-16T22:12:35.830 に答える
5

ここに良い記事があります:

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" >
于 2009-03-16T22:08:10.443 に答える
2

エンティティの特定のコレクションを遅延ロードするには、コレクション マッピングで "lazy=true" を使用します。例えば:

<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true">
  <key column="PersonID" />
  <one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" />
</bag>
于 2009-03-16T22:25:16.953 に答える
1

ここでの答えはすべて正しいですが、移行する注文が非常に多い場合は、フィルターも使用する必要があるため、すべてを読み込む必要はありません。

顧客customer=session.CreateCriteria(...)
              .SetFetchMode( "Orders"、FetchMode.Lazy)
              .UniqueResult <Customer>();

Ilist <Order>orders = session.CreateFilter(customer.Orders、 "WHERE this.OrderDate <?")
                      .SetDateTime(...)。List();
于 2009-03-16T23:32:01.427 に答える
1

Customer エンティティに、すべての Orders を含むプロパティが必要ですか? これはかなり大きなコレクションになると思います。
自問しなければならない質問は次のとおりだと思います:
Customer の Orders に直接アクセスする必要があるのは何回ですか?

おそらく、この場合、双方向の関連付けは必要ないでしょうか? おそらく、Customer クラスに Orders コレクションを持ちたくないでしょう。
次に、次の署名を持つメソッドを Order Repository に追加します。

IList<Order> GetOrdersForCustomer( Customer c );

しかし、これがあなたの状況に適しているかどうかはわかりません。

于 2009-04-01T07:55:58.723 に答える