2011-09-06 17 views
4

這似乎應該是一個明顯的事情,但我一直在尋找答案几個小時,但沒有成功。如果沒有連接到會話,則攔截NHibernate惰性加載行爲以返回null?

我使用NHibernate來持久化一個域模型,並提供一個服務於ASP.NET MVC前端的服務層('服務層'當前只是一個標準類庫,但可能在將來轉換爲WCF )。 Web應用程序詢問所需數據,並指定它需要的域對象上的集合,服務層接受請求,加載對象和所需集合(使用延遲加載),並將對象傳回到使用AutoMapper轉換的位置以視圖模型友好的表示。

我想要做的是加載所需的集合,從會話中分離對象並將其傳遞給前端。但是,當AutoMapper嘗試映射對象時,會導致出現異常,因爲它試圖訪問尚未初始化且會話不再可用的集合。我可以讓對象連接,但在這種情況下,AutoMapper轉換最終會導致對象上的所有屬性無論如何都會被延遲加載,並且這不會成爲我們沿着WCF路由的選項。

我想要做的就是改變這種行爲,以便不會拋出異常,而是在它沒有連接到會話時返回null(或更好的是空的)。這是Entity Framework V1中的默認行爲(我承認它沒有執行自動延遲加載),我之前使用過它,但是我無法在NH中找到一種方法。

任何想法?我在這裏錯了嗎?

編輯 - 要什麼我想要實現更清晰一點,訪問一個集合屬性時,我想這種行爲:

連接到會話:延遲加載集合爲正常。
無會話:屬性爲null(而不是拋出異常)

更新 - 比利·麥卡弗蒂繼this post,我已經成功地實現使用IUserCollectionType,似乎工作至今的解決方案。不像他那樣使用提供的PersistentGenericBag,我不得不創建新的類型來改變沒有連接到會話時的行爲。這並不完美,需要一些非常醜陋的映射,但至少我不需要觸摸我的域對象或客戶端映射來使其工作。

+0

你的意思是說集合是懶加載的,或(也)在你的nhibernate映射中標記爲懶惰的類的屬性?也許你可以發佈一個域類和相應的視圖模型類的示例代碼。 –

+0

是的,懶加載的集合。我的域類是一個相當簡單的標準屬性和集合的混合。這些被映射到Web應用中的DTO類型類。視圖模型可能由幾個這樣的類組成。 –

+0

好的,我明白你的意思了。是的,你是正確的,我的DTO不是非常具體,我可以通過爲每個使用場景創建一個DTO來避免這個問題,但是這會導致許多類似的類和重複,如果可能,我想避免這種類型和重複。 –

回答

1

在這種情況下,最合適的解決方案可能是在AutoMapper中檢查延遲加載字段,如果它們確實用NHibernateUtil.IsInitialized()加載的話。不知道如何/如果可能使Automapper使用此檢查所有隱式屬性映射。

老問題,但這是我們做了解決同一問題,希望它有助於設置你正確的道路上,如果有人絆倒這個問題。