我想覆盖在映射中设置为'lazy = false'的默认延迟加载行为。无法更改它,因为现有应用程序的许多部分都依赖于此设置。
花了几个小时后,我找不到解决方案,所以我在这里问。
怎么做?
我想要实现的是微调我的查询以仅加载所需的内容
这是我已经尝试过的:
使用var properties = session.QueryOver<Property>()
.Fetch(prop => prop.Transactions).Eager
.Fetch(prop => prop.Districts).Eager
//I dont want to load those entities below so I mark
//them as lazy - IT DOESN'T WORK
//I can see in SQL that they are getting loaded in separate queries
.Fetch(prop => prop.Districts.First().Aliases).Lazy
.Fetch(prop => prop.Districts.First().PolygonPoints).Lazy
.Skip(i * pageSize)
.Take(pageSize)
.List();
api:
Criteria
使用var criteria = session.CreateCriteria<Property>();
criteria.SetFetchMode("Transactions", NHibernate.FetchMode.Join);
criteria.SetFetchMode("Districts", NHibernate.FetchMode.Join);
criteria.SetFetchMode("Districts.Aliases", NHibernate.FetchMode.Select); // tried Lazy too
criteria.SetFetchMode("Districts.PolygonPoints", NHibernate.FetchMode.Select); // tried Lazy too
criteria.AddOrder(NHibernate.Criterion.Order.Asc("Id"));
criteria.SetFirstResult(i * pageSize);
criteria.SetMaxResults(pageSize);
var properties = criteria.List<Property>();
api:
List<>()
使用上述任何方法时,在调用{{1}}时始终会加载“别名”和“PolygonPoints”。在我的过程中我不需要它们。
我正在使用Nhibernate 4.0 有什么想法吗?
答案 0 :(得分:2)
在这种情况下,我们无法覆盖映射。我们可以采用相反的方式 - 懒惰到位 - 并使用急切的查询来进行查询。
决策过程(of reference loading)
在查询之外完成,事后。所以它可以预加载,但无法避免。
此处的解决方案可能有两种类型。
projections
。指示NHibernate只创建一个查询,使用转换器获取预期的对象图 - 其中没有任何代理如果(正确地)使用投影列表,即使是参考文献,也有非常清楚的例子:
我们还需要自定义结果转换器,它将事后创建返回数据的所有引用: