2011-01-07 17 views
0

NHibernation遅延ロードでの説明が必要:私が子供のコレクションの価格でクラスの製品を持っている

public class Product 
{ 
    private ICollection<Price> prices; 

    protected Product() 
    { 
     prices = new List<Price>(); 
    } 
} 

ザ・NHibernateのマッピングは、この

<xml version="1.0" encoding="utf-8"> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Product" table="Product"> 

    <id name="id" column="ProductId" access="field"> 
     <generator class="identity"/> 
    </id> 

      <bag name="prices" access="field" cascade="all-delete-orphan" lazy="true"> 
     <key column="ProductId"/> 
     <one-to-many class="Product.Price"/> 
    </bag> 

     </class> 

のように見えるあなたは、その安値を見ることができますコレクションが遅延読み込まれます。

public ICollection<Product> ListProducts() 
    { 
     ISession session = GetCurrentSession(); 

     return session 
      .CreateCriteria(typeof(Product)) 
      .List<Product>(); 
    } 

機能は以下の内容を持っているGetCurrentSession()、上で参照:

製品は、データベースからこのようにロードされ、私は製品をロードすると

protected ISession GetCurrentSession() 
    { 
     return sessionProvider.GetCurrentSessionFrom(sessionFactoryConfigName); 
    } 

、私はそれに期待します価格がlazy-loading = trueであるため、製品内のPrice-Collectionsの場所はプロキシです。しかし、デバッグ中は、Visual Studioウォッチツールを使用して製品を見ることができ、フルコンテンツ(すべてのプロパティを含む価格)の価格コレクションを見ることができます。なぜこれはそうですか?

答えて

2

デバッグ中に価格プロパティにアクセスしたので、プロキシは商品コレクションをロードしています... つまり、価格プロパティを「監視」することによって、遅延読み込みプロセスが開始されました。

あなたは実行されるSQL文は、出力されるように(show_sql設定オプション)NHibernateは設定することで、何が起こるかを見ることができます。

3

VSは常にターンロードにケース価格のすべての価格がnullの価格のgetterメソッドをトリガーするため。 SQL Serverを使用していて、遅延読み込みが正常に機能しているかどうかを確認するには、SQL Server Profiler(Express Editionを使用している場合は、AnjLab SqlProfilerを使用してください)を使用します。

+0

またはlog4netのでNhiberanteによって記録されたSQL文を使用します – Paco

関連する問題