覆盖延迟加载行为 'lazy=false'
Override lazy loading behavior 'lazy=false'
我想覆盖在映射中设置为 'lazy=false' 的默认延迟加载行为。无法更改它,因为现有应用程序的许多部分都依赖于此设置。
花了几个小时后我没有找到解决方案,所以我在这里问。
如何做到这一点?
我想要实现的是微调我的查询以仅加载需要的内容。
这是我已经尝试过的:
使用 QueryOver
api:
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();
使用 Criteria
api:
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>();
使用上述任何方法 'Aliases' 和 'PolygonPoints' 在调用 List<>()
时总是被加载。我的过程中不需要它们。
我正在使用 Nhibernate 4.0。
有什么想法吗?
在这种情况下,我们不能覆盖映射。我们可以采用相反的方式 - 设置惰性 - 并使用急切获取进行查询。
决策过程 (of reference loading)
在查询之外完成,例如 post。所以可以预载,但无法避免。
这里的解决方案可能有两种类型。
- 第一个是首选(我) - 尽力而为,默认懒惰:Ayende -
NHibernate 是懒惰的,忍受它
- 使用
projections
。指示 NHibernate 只创建一个查询,使用转换器来获取预期的对象图——其中没有任何代理
有非常清楚的示例如何(正确地)使用投影列表作为参考:
- Fluent NHibernate - ProjectionList - ICriteria is returning null values
而且我们还需要自定义结果转换器,它将 post 根据返回的数据创建所有引用:
- 自定义DeepResultTransfomer
我想覆盖在映射中设置为 'lazy=false' 的默认延迟加载行为。无法更改它,因为现有应用程序的许多部分都依赖于此设置。
花了几个小时后我没有找到解决方案,所以我在这里问。
如何做到这一点?
我想要实现的是微调我的查询以仅加载需要的内容。
这是我已经尝试过的:
使用 QueryOver
api:
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();
使用 Criteria
api:
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>();
使用上述任何方法 'Aliases' 和 'PolygonPoints' 在调用 List<>()
时总是被加载。我的过程中不需要它们。
我正在使用 Nhibernate 4.0。
有什么想法吗?
在这种情况下,我们不能覆盖映射。我们可以采用相反的方式 - 设置惰性 - 并使用急切获取进行查询。
决策过程 (of reference loading)
在查询之外完成,例如 post。所以可以预载,但无法避免。
这里的解决方案可能有两种类型。
- 第一个是首选(我) - 尽力而为,默认懒惰:Ayende - NHibernate 是懒惰的,忍受它
- 使用
projections
。指示 NHibernate 只创建一个查询,使用转换器来获取预期的对象图——其中没有任何代理
有非常清楚的示例如何(正确地)使用投影列表作为参考:
- Fluent NHibernate - ProjectionList - ICriteria is returning null values
而且我们还需要自定义结果转换器,它将 post 根据返回的数据创建所有引用:
- 自定义DeepResultTransfomer