Fetch Eager NHibernate无法懒惰地初始化集合

时间:2013-09-16 16:51:56

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

我正在处理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集合。

2 个答案:

答案 0 :(得分:0)

您是否使用过HQL以及... LEFT JOIN FETCH ...?它也提供了相同的问题吗?

答案 1 :(得分:0)

映射应该使用

.Access.ReadOnlyPropertyThroughCamelCaseField

代替。