覆盖延迟加载行为 '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