2008-11-11 146 views
6

我想在Application_BeginRequest中設置實體對象上下文會很明智,將它存儲在Request.items中,在整個請求中使用它並將其置於Application_EndRequest中。這樣,上下文總是可用的,我可以瀏覽我的視圖中的實體框架對象圖,延遲加載我還沒有預先獲取的內容。ASP.NET MVC與實體框架

我認爲這會使它像在Ruby on Rails上發展一樣。

這可能是我應該出手的說這樣的異端,但它是如此瘋狂也許會工作:)

我不能得到的Application_BeginRequest和..EndRequest火上ASP.NET MVC雖然。他們不是被解僱嗎?我需要做什麼特殊的技巧?

回答

5

ASP.NET MVC的1.0構建讓我在beginrequest和endrequest上掛接事件處理程序,創建SessionScope並將其存儲在beginrequest(我切換到Castle ActiveRecord)和endrequest中的HttpContext.Items中從HttpContext.Items中選擇會話鏡並放置它。這可以在整個請求生命週期中啓用延遲加載。 (甚至可以在視圖中導航對象圖)。

5

EF中的對象上下文與L2S中的數據上下文一樣,被設計爲「工作單元」,它們不是線程安全的,而且它們的設計也不長久。

在MVC中,最好的策略是在控制器的構造函數中創建一個(隱式或顯式,無關緊要),然後將其置於Dispose方法中。當然,EF不會進行懶加載,所以你必須找到你自己的懶惰方式。 :)

+3

不,這是一個不好的方法。它使控制器很難測試,也意味着控制器之外的工作單元不可用。下面提到的Session-per-request模式更好。 EF v1支持延遲加載 - 只需要明確。 – 2009-03-31 01:01:35