1

私は 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())

なぜすべてをロードするのですか?

ありがとう

4

1 に答える 1

1

生成されたhbm.xmlを投稿できますか?

また、このクエリを試して、usingステートメントの後にレイジープロパティにアクセスするとどうなるかを確認してください...

Summary summary  = null;

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    summary = session.QueryOver<Summary>()
        //.Fetch(x => x.Reports).Eager
        .Where(x => x.Id == workItemId)
        .SingleOrDefault<Summary>();

    tx.Commit();
}
于 2013-01-25T19:54:36.950 に答える