2009-03-16 17 views
3

顧客に多数の注文が添付されている場合。どのようにNHibernateを使ってOrders Listを読み込むのが怠惰でしょうか?NHibernateでの遅延ロード

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

答えて

4

HERESに良い記事:上記の記事から

http://blogs.chayachronicles.com/sonofnun/archive/2007/03/30/230.aspx

最も一般的には単に「怠惰= 『true』を」属性や場所のデフォルトを持つクラスをマークすることです-lazy = "true" を」マッピング宣言で:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="@[email protected]" 
default-access="nosetter.camelcase-underscore" default-lazy="true"> 

それとも

<class name="Cei.eMerge.Core.Domain.Contacts.Contact" table="Contact" lazy="true" > 
7

クリスの提案は、あなたがそうのような怠け者であるためにあなたの条件にFetchmodeを設定することができ、実行時にそれをしたいがあれば、私はそれを行うだろうかです:

criteria.SetFetchMode("Orders", FetchMode.Lazy) 
2

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

<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true"> 
    <key column="PersonID" /> 
    <one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" /> 
</bag> 
1

ここでの回答のすべてが正しいですが、非常に多くの注文がある場合、あなたはまた、あなたがそれらのすべてをロードする必要がないように、フィルタを使用したいmigth。

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

Ilist<Order> orders = session.CreateFilter(customer.Orders," WHERE this.OrderDate < ?") 
         .SetDateTime(...).List(); 
1

お客様のエンティティには、すべてのオーダーが含まれているプロパティが必要ですか? これはかなり大きなコレクションになると思います。
あなた自身に尋ねなければならない疑問は、
本当に顧客の注文に何度もアクセスする必要がありますか?

おそらく、この場合、双方向の関連付けをしたくないのでしょうか?おそらく、CustomerクラスにOrdersコレクションを置くことは望ましくありません。
その後、私は次のシグネチャがあり、私の注文リポジトリにメソッドを追加します。

IList<Order> GetOrdersForCustomer(Customer c); 

をしかし、これはあなたの状況に実現可能であるならば、私は知りません。

関連する問題