我试图掌握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())
为什么要加载所有内容?
由于
答案 0 :(得分:1)
你能发布生成的hbm.xml吗? example
此外,尝试此查询,看看如果在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();
}