2010-12-22 101 views
4

是否可以在打開的會話期間延遲加載相關對象,但在會話關閉後仍然有相關對象可用?NHibernate延遲加載 - 會話關閉後

例如,我們有一個USER類和一個相關的ROLE類。當我們加載一個用戶時,我們也懶加載相關的ROLE對象。我們可以在會話關閉後將USER和ROLE類完全加載並可用嗎?

此功能可能嗎?

回答

8

簡答:沒有。在會議結束之前,您必須初始化任何您需要的內容,然後再結束會議。用於強制加載懶惰代理(不枚舉它)的方法是NHibernateUtil.Initialize(USER.ROLES)

長答案...種。可以將對象重新附加到新會話,從而允許初始化PersistentBags和其他NH代理。假設您知道對象存在於數據庫中但不在新會話中,並且您尚未修改它的最佳方法是Session.Lock(USER, LockMode.None)。這會將對象與新會話關聯起來,而不會告知NHibernate在讀取或寫入對象時做任何事情。

然而,請注意,這是一種代碼味道。如果您經常將對象重新連接到新會話,則表示您未將會話保持足夠長的時間。例如,爲每個窗體打開一個會話並沒有問題,並且只要窗體打開就保持打開狀態,並在窗體關閉時關閉它。

0

如果您正在處理1-1關係(每個用戶0-1角色),那麼最簡單的選擇可能是將其配置爲提前取回而不是延遲加載。延遲加載實際上是面向1- *親屬或特別大且很少需要的對象。 NH在優化查詢方面做得相當不錯,可以在這樣的場景中快速包含熱切的數據。

0

是的。一旦會話關閉,任何延遲加載的對象都將保留在內存中,您可以毫無問題地訪問它們。