7

Future を次のように使用して呼び出されるマルチレベル オブジェクト グラフがあるとします。

var Dads = db.Session.Query<Parent>().Where(P => P.EntityKey == Id)
             .ToFuture<Parent>();
var Kids = db.Session.Query<Kid>().Where(K => K.Parent.EntityKey == Id)
             .ToFuture<Kid>();

var Dad = dads.ToList() を呼び出すと、バッチがネットワークを経由してプロファイラーに表示されます。

問題は、コレクションを列挙するときに、データベースに 1 回限りのクエリを送信していることです。

例えば。

for each (Kid kid in Dad.Kids) // This seems to hit the database 
{
   Teach(kid);
}

SQL クエリを送信し、データベースにヒットして各子供を取得します。オブジェクト グラフが読み込まれないのはなぜですか? またはこれは予想される動作ですか?

4

1 に答える 1

4

その動作は予期されるものです。データベースから 2 つのコレクションをバッチで取得するように NHibernate に指示しているだけで、指示どおりに実行しています。ただし、それらが関連しているとは言いません。Futures を使用した NH クエリは、結合でそうするように指示されない限り、実行後にエンティティを結合しません。

Futures を使用せずに個別のクエリを実行した場合、Parent エンティティで子コレクションが突然満たされるとは思わないでしょう。基本的に、Future を使用すると、1 回の往復で物事を実行できます。クエリがたまたま複数の子コレクションを持つ共通のルートを持つ場合 (デカルト積を避けるためなど)、NH は複数のコレクションを 1 つのエンティティに「結合」できます。

残念ながら、NH LINQ Api と結合し、このToFuture()メソッドは現在の (NH 3.0 または 3.1) 実装で問題を引き起こすようです。その場合、QueryOver Api を使用する必要がある場合があります。

余談ですが、メソッド名が適切ではないと思います。

編集:質問の編集後、メソッド名はOKになりました。

于 2011-03-25T16:44:53.197 に答える