0

我正在處理N + 1問題,我想在特定的查詢中加載一個集合,但我得到了「未能懶惰地初始化集合」錯誤,或者查詢保持延遲加載。Fetch Eager NHibernate未能懶洋洋地初始化一個集合

我嘗試了很多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集合。

回答

0

您是否使用過HQL和... LEFT JOIN FETCH ...?它也提供了相同的問題嗎?

+0

不,我不知道如何使用HQL呢。我會搜索它 – TiagoBrenck

+0

根據我的經驗,最好使用HQL,因爲有時很難用流暢的方法對某種查詢進行建模。我會使用HQL,稍後解決問題,一旦它發生在其中。 –

0

映射應該使用

.Access.ReadOnlyPropertyThroughCamelCaseField 

代替。

相關問題