2009-09-30 48 views
4

使用Castle ActiveRecord時,我在懶加載時偶然發現了一個問題。爲什麼NHibernate延遲加載綁定到會話?

下工作(顯然)

using (new SessionScope()) 
{ 
    User singleUser = User.FindFirst(...) 
    UserGroup groups = singleUser.Groups; // Lazy-loading groups. 
} 

因爲我需要(使用攔截器)來修改會話過濾器在一定的背景下,我創建了一個新的SessionScope。

using (new SessionScope()) 
{ 
    User singleUser; 
    EnableVariousFiltersInThisThread(); 
    using (new SessionScope()) 
    { 
     singleUser = User.FindFirst(...); 
    } 
    DisableVariousFiltersInThisThread(); 
    UserGroup groups = singleUser.Groups; // Lazy-loading groups. 
} 

最後一行「singleUser.Groups」拋出LazyInitializationException中:「未能初始化懶洋洋角色的集合:組,沒有會話或會話已關閉」。

但是,所有其他會話操作都能正常工作。因此,「單用戶」似乎與現在處置的SessionScope綁定。爲什麼?而這又如何可以解決呢?

回答

0

我的GUESS是 - 部分原因是關於「身份地圖」。不僅延遲加載對象,而且所有對象都綁定到一個會話。這確保沒有兩個對象表示數據庫中的單個行。

4

我相信這是NHibernate的工作方式。

您的實體都與會話相關聯,並將其用於延遲加載。如果您處理會話,則無法獲取延遲加載的集合和屬性。考慮到這個限制,明顯的答案是避免處理會話 - 或者保持會話一直存在,直到您提取了所需的數據。

內部範圍與外部沒有區別;它不支持這個範圍之外的延遲加載。

但是,如果你欺騙NHibernate進入內部範圍內的急切加載,你可以解決這個限制。或者,在退出範圍之前,請致電.ToList()或您希望使用的收集類似物,並且數據也將在外部提供。

+0

顯然它是NHibernate的工作原理。問題是爲什麼:-)感謝您的替代建議。 – mbp