私は QueryOver を理解しようとしていますが、ReportRows コレクションが熱心に読み込まれたサマリー アイテムが返されることを期待していました。
更新 コードの最初のブロックは私の最初の質問にはありませんでしたが、それが私の問題の原因でした-答えてくれたdotjoeに感謝します
// some code to create a Summary and a whole graph of child records
...
// then...
session.Save(summary);
session.Flush(); // write the changes
session.Evict(summary); // clear out session to check my query below is 'fresh'
// Originally-posted code
Summary summaryAlias = null;
Report reportAlias = null;
var summaryQuery =
session.QueryOver<Summary>(() => summaryAlias)
.Fetch(x => summaryAlias.Reports).Eager
.Left.JoinAlias(() => summaryAlias.Reports, () => reportAlias)
.Where(() => summaryAlias.Id == workItemId);
Summary summary = summaryQuery.SingleOrDefault<Summary>();
session.Close();
ただし、session.Close() が呼び出された後にブレークポイントに到達すると (それ以上の遅延読み込みを防ぐため)、ReportRows コレクションだけでなく、Summary クラスのすべてが読み込まれていることがわかります。
期待していなかったにもかかわらず、入力されたもののいくつかの例:
ReportRow.Student
ReportRow.Programme
ReportRow.Programme.Modules (a collection)
ReportRow.Programme.Modules.Components (another collection inside each 'Module')
私は Fluent 自動マッピングを使用しており、確実に使用するために遅延ロードされるように構成しました。
.Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Always())
そしてまた試しました...
.Conventions.Add(FluentNHibernate.Conventions.Helpers.LazyLoad.Always())
なぜすべてをロードするのですか?
ありがとう