2009-02-24 17 views
5

私は非常に深いオブジェクトグラフ(5-6ノード)を持っており、NHProfの部分をトラバースすると "Select N + 1"という問題が発生しています行う)。流暢NHibernate選択n + 1

私の知る2つのソリューションです

  1. イーガーロード子ども
  2. ブレーク離れて私のオブジェクトグラフ(と熱心負荷)私は本当にいずれかを実行したくない

これらのうち(私はそれが成長を見ているように後でグラフを分割することがありますが)

今のところ....

NHibernate(FluentNHibernateを持つ)は、子供にアクセスしようとするたびにselect-n + 1-ingの代わりにそれらを一度にロードするように指示することはできますか?

私も、おそらく同じ問題(というか、可能な場合は、上記の溶液によって解決される)であるのが、「無限の結果が設定され、」取得しています。

各子コレクション(グラフ全体で)は約20人しかいませんが、20^5はたくさんあるので、ルートを取得するときにすべてを読み込もうとは思っていませんが、私が近くに行くたびに子供のコレクション。

編集:あとで考える...私は子供をレンダリングするときにページングを導入したいのですが?ここで私のオブジェクトグラフを壊さなければならないのですか、それともこれらの問題を解決するために使用できるいくつかの卑劣さがありますか?

答えて

9

このシナリオを処理するための特定のnhibernateクエリを作成するのではなく、ドメインモデルを使用する方法を追求したいと思うことは間違いありません。これを踏まえて、コレクションに適用できるバッチサイズの属性を見てみることをお勧めします。流暢NHibernateは流れるようなインターフェイスは、まだこの属性をサポートしていませんが、作品としてあなたの周りに使用することができます。

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

をあなたの正確なシナリオについての情報の一般的な不足を考えると、私は、バッチサイズがあるかどうかを確かに言うことはできません理想的な解決策ですが、私は確かにそれを行くことをお勧めします。あなたがまだの場合は、私はあなたがこれらを読むことをお勧め:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernateのパフォーマンスのドキュメントをどのようにバッチサイズの作品を説明します。

編集:あなたのドメインモデルからページングする方法はわかりません。ページングが必要なシナリオにNHクエリを書くことをお勧めします。

+0

"このシナリオを処理するために特定のnhibernateクエリを作成するのではなく、ドメインモデルを使用するアプローチを追求したいと思うことは間違いありません。確かに。私が望む最後のものは特定のクエリです。そのことをチェックしてください。 –

+3

note - > fluent-nhインターフェイスは、BatchSize()属性をサポートするようになりました。 – KevinT

0

編集:付け足し....私は が子供をレンダリングするときに、ページングを紹介したい 場合は何?私はここで 私のオブジェクトのグラフを壊さなければならない、またはいくつかがあります これらすべての問題を解決するために私はすべてを解決するために採用することができますか?

子供たちだけを読み込んで、それらをページすることができます:)。しかし、あなたがLoadParentとPageChildrenのようなものを望むなら、私はあなたがそれを行うことができるとは思わない。