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()之后遇到断点(以防止任何进一步的延迟加载)时,我发现我的 Summary 类中的所有内容都已填充,而不仅仅是 ReportRows 集合。

即使我没想到它们也会填充的一些示例:

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 回答