2008-12-01 46 views
2

我在一個新的ASP.NET項目上使用NHibernate,並運行到我認爲是奇怪的行爲。我試圖通過使用HttpModule來捕獲EndRequest事件並關閉會話來管理我的會話。然而,在EndRequest事件激發後,這很好,我在我的一個自定義控件的OnLoad事件中嘗試從我的對象中讀取一個屬性,該對象是延遲加載的異常。我收到一個例外,說明'未能懶惰地初始化集合,沒有會話或會話被關閉'。關閉這些屬性的延遲加載確實解決了問題,並且是可接受的解決方案。但這似乎違背了我一直認爲是真實的。使用EndRequest事件關閉NHibernate會話與IIS 7

我會假設OnLoad事件和所有服務器端處理將在EndRequest被觸發的時候完成。這也是我第一次在項目中使用IIS 7。這是行爲的原因嗎?預期的行爲是什麼?

+0

您可能想查閱這篇文章以獲取更多關於在HTTP模塊中使用NHibernate的信息。 – 2008-12-01 16:31:27

+0

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx – 2008-12-01 16:36:08

回答

2

我剛剛做了一個'掌sla額'的時刻。儘管事實上我正在部署到IIS 7服務器,但我一直在使用VS 2008內置Web服務器(Casini)進行調試。 Casini通過ASP.NET管道傳遞所有請求,但IIS沒有。這導致了一個圖像文件或JavaScript文件(或任何其他靜態資源)的請求來關閉我的NHibernate會話之前,我真的認爲它應該關閉。

感謝資源列表,我一定會考慮一下。

1
  1. 如果您的對象是lazy-init並且沒有會話處於打開狀態,則解析屬性將失敗。
  2. 請記住,當您與另一個尚未初始化的實體有某種關係時,很可能會出現惰性異常。

http://forum.springframework.org/showthread.php?t=13474

我也建議使用像HTTP模塊在Rhino Commons來管理NHibernate的會議。

0

如果您需要延遲加載,請使用HttpModule。從它繼承你的類,然後你有兩個可以覆蓋的方法(不記得它們的名字)。每次請求任何頁面時,都會調用第一個。在那裏打開會話並將會話置於視圖狀態。另一種方法是在頁面發回時調用,在那裏關閉會話。

1

您應該使用shrinkwrapped包來處理此問題。

我喜歡使用Autofac與ASP.NET/MVC集成。只要您需要,您只需要詢問RequestContainerISession,並且由於ISessionIDisposable,噹噹前請求結束時,RequestContainer會自動知道處置ISession。一切都爲你照顧。