2010-11-24 23 views
0

私はこのシナリオがあります。今Nhinerbate遅延ロードが

map.Reference(a => a.Child).LazyLoad(); 

私のような何かを:クラスAのマッピングで

class A 
{ 
    public virtual int Id { get; set; } 
    public virtual B Child { get; set; } 
} 

class B 
{ 
    public virtual int Id { get; set; } 
} 

を、私はクラスBへの参照を持っています:

Session.Query<TypeOfA>().Select(a => a); 

通常のselect * from ATableとは別に、AラインごとにBTableからn個のselectを取得します。遅延読み込みがうまくいかないようですか?

私の質問は以下のとおりです。

  1. がどのように私はここにlazyloadを動作させるために?
  2. AエンティティとBエンティティを1回のクエリで使用できますか?

答えて

3

レイジーローディングはデフォルトでオンになっていると、実際に動作するはずです、ありがとうございます。たとえば、クラスBのプロキシを生成できないなどの問題がある場合は、セッションファクトリの作成時に不平を言います。

Bのクエリはクエリ自体で実行され、Aには後でアクセスできませんか?

Bへのアクセスを最適化するには、2つの方法があります。1つのクエリでAとともにそれらをフェッチすることができます。 (私は流暢知らない、これはそれを設定するには、XMLの方法です:)

<many-to-one fetch="join" ...> 

リストを使用し、またあなたのクエリ多くを爆破することができたときにこれは、いくつかの問題を抱えています。もちろん、怠惰な読み込みではありません。

もう1つ、非常に素晴らしく強力な最適化はバッチフェッチです。インスタンスを別々のクエリでフェッチすることができますが、複数のインスタンスを一度にフェッチします。

<class name="B" batch-size="20" ...> 

これは、1回のクエリで20個のBを一度にフェッチします。また、リストのために提供されています:

バッチサイズを使用するようにStafanの提案に拡大
<one-to-many fetch-size="20" ...> 
+0

@Tom:これは正しくありません。 * anohter * batch-sizeがあり、これは設定で設定し、ADO.NETのバッチ処理を使用します。これは、更新および挿入ステートメントのために、セッションをフラッシュするときにNHがバッチを作成するようにします。これはSQL Serverでのみ使用できます。 (http://ayende.com/Blog/2006/09/16/BatchingSupportInNHibernate.aspxを参照してください)。しかし、私が話しているバッチサイズはクエリ用であり、データベースに依存しません。 –

+0

私の間違い - 私は自分のコメントを削除しました。 –

+0

@Tom:NHはあいまいな言葉を使うことがあるという問題があります。機能の理解を非常に困難にします。 –

0

、迅速なGoogle検索は、流暢NHibernateのは、今のクエリのためのBatchSizeをサポートしていることを明らかにしました。ドキュメントから:

ClassMap<T> BatchSize(int size) 

Sets the query batch size for this entity. 

はそれを自分自身を使用したことがない、とドキュメントが(FNHの多くのように)最小限のですが、多分あなたは、いくつかのサンプルコードを見つけることができます。