0

私は N+1 問題を扱っており、特定のクエリでコレクションを熱心にロードしたいのですが、「コレクションの遅延初期化に失敗しました」というエラーが発生するか、クエリが遅延ロードを続けます。

スタックメンバーからの多くの提案を試しましたが、うまくいきませんでした。

私のエンティティの例:

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 コレクションを積極的にロードする必要があります。

4

2 に答える 2

0

マッピングは使用する必要があります

.Access.ReadOnlyPropertyThroughCamelCaseField

代わりは。

于 2013-09-29T12:53:36.680 に答える