【问题标题】:Fetch Eager NHibernate failed to lazily initialize a collectionFetch Eager NHibernate 无法延迟初始化集合
【发布时间】:2013-09-16 16:51:55
【问题描述】:

我正在处理 N+1 问题,我想在特定查询中急切加载集合,但我收到“无法延迟初始化集合”错误,或者查询保持延迟加载。

我已经尝试了 stackmembers 给出的许多建议,但没有一个奏效。

我的实体示例:

public class Bar
{
   private _IList<Foo> _fooList;
   public IEnumerable<Foo> FooList {get{return _fooList;} }
}

地图示例:

HasMany(d => d.FooList)
                .Access.CamelCaseField(Prefix.Underscore)
                .KeyColumn("IdBar")
                .Cascade.AllDeleteOrphan()
                .Inverse();

抛出错误的查询(无法延迟初始化集合):

var test = GetSession().Query<Bar>()
                .Fetch(b => b.FooList);

IList<Bar> bars= GetSession().QueryOver<Bar>()
                .Fetch(d => d.FooList).Eager
                .List();

仍然有 N+1 问题的查询:

        IList<Bar> bars= GetSession().QueryOver<Bar>()
            .Fetch(d => d.FooList).Eager
            .JoinQueryOver<Foo>(d => d.FooList)
            .Where(f => f.Active).List<Bar>();

        Foo fooAlias = null;
        IList<Bar> bars= GetSession().QueryOver<Bar>()
            .Fetch(d => d.FooList).Eager
            .JoinAlias(d => d.FooList, () => fooAlias)
            .List();

我需要帮助来解决这个 N+1 问题,急于加载 FooList 集合。

【问题讨论】:

    标签: c#-4.0 nhibernate fluent-nhibernate linq-to-nhibernate queryover


    【解决方案1】:

    您是否将 HQL 与 ... LEFT JOIN FETCH ... 一起使用?它是否也提供了相同的问题?

    【讨论】:

    • 不,我还不知道如何使用 HQL。我会搜索它
    • 根据我的经验,最好使用 HQL,因为有时很难以流利的方法对某种查询进行建模。我会使用 HQL 并稍后解决问题,一旦它也发生在其中。
    【解决方案2】:

    映射应该使用

    .Access.ReadOnlyPropertyThroughCamelCaseField
    

    改为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2020-05-10
      • 2010-11-30
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多