2011-11-30 59 views
0

我正在使用NH將數據庫映射到名爲location的對象,該對象具有一些屬性,並且列表<Attachments>附件(與lcocation的實例具有一對多關係)。無法在n層web應用程序中執行延遲加載

我用lambda表達式來初始化location istance:

public IList<T> GetAllByExpression(Expression<Func<T,bool>> expression) 
     { 
      using (ISession session = NHibernateHelper.OpenSession()) 
      { 
       return session.Query<T>().Where(expression).ToList(); 
      } 
     } 

在我嘗試訪問location.attachments集合,但得到一個異常代碼中的一些後來點:

{"Initializing[Location#543c7367-08fa-4469-a252-8e2c6163be22]-failed 

懶洋洋地初始化一個角色集合:Location.Attachments,沒有 會話或會話已關閉「}

我明白這個會議已經結束,但我沒有什麼可以做的。

我明白會議已經結束,但我無能爲力。

我有一個困境: 1)代碼使用從數據庫中提取後的集合,並需要會話仍然是開放的。 將會話全部開放是一種不好的做法。 (沒有using)。

2)即使我在整個應用程序運行時期間打開會話,我也構建了一個n層Web應用程序。 DAL應該是通用的,並且不公開某些實現的會話(本例中爲NH)。

3)急切的加載似乎是解決方案,但它是浪費 - 因爲我必須急切地加載所有數據,以防其中包含其他對象列表的對象。 (甚至可以繼續循環)

我該怎麼辦?

TIA

回答

1

正如Jason所說,這是因爲你關閉了會議。

如果您正在使用Web窗體,那麼您可能需要查看Session Per Request,其中會話在Http Request開始時打開,並在Http Request結束時關閉。 (針對這些RequestBegin/RequestEnd事件的全局asax)

這將使您能夠延遲加載。

或者,您可以通過實現一個您傳遞到存儲庫的提取策略,以「在獲取我的根的同時獲取相關數據」來熱切獲取您想要的數據。

3

心理調試上:

看起來你要加載在收集你已經關閉了在會議結束後,或者您正試圖加載上一個比一個不同的會話集合加載根實體。

不要這樣做。

+0

但我不能讓會議永遠開放? –

+0

@Elad Benda:你不應該。對於單個工作單元,會話應該是短暫的。 – jason

+0

所以我從ORM初始化了一個Location對象,後來我不得不解決它中的「附件」集合(一對多關係)。我怎樣才能做到這一點? –