MVC 3 + EF 4.1在MVC中實例化和處理DbContext的最佳方式是什麼?
我對付的DbContext兩種方法之間進行選擇:
- 實例化
Application_BeginRequest
,放入HttpContext.Current.Items
和Application_EndRequest
處理。 - (爲
DbContext
kindof包裝)創建一次性的UnitOfWork並 開始using(var unitOfWork = new UnitOfWork()) { ... }
每個控制器動作分享您的體驗,請:一個你會喜歡哪一種?每種方法有哪些優缺點?
使用塊方法有一些缺點。它會導致很多往返數據庫和濫用Entity框架中的事務。請參閱http://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request – marvelTracker
爲什麼會導致更多往返?一個http請求應該在大多數情況下運行一個動作,所以如果你將整個動作的代碼包裝到這個使用塊中,與第一種方法相比,不會有更多的數據庫請求。 「每操作」方法的另一件事是,您應該始終注意數據庫可能被調用的作用域並適當地放置該塊。例如,如果您的模型包含一些要在一段時間視圖渲染中加載的集合,則返回View(Model)的語句應該位於該塊內部。 – YMC
如果在控制器層中使用DbContext,則UnitOfWork會在UI層和數據庫方法中創建強依賴關係。然後你需要一個服務層和存儲庫層。之後,如果您的存儲庫使用單獨的UnitOfWork,並使用將成爲問題的塊。因爲每個存儲庫都會創建事務和不必要的數據庫往返。請參閱上面的鏈接瞭解更多詳情如果你確定每個請求有一個服務調用,那麼你可以在服務方法內部使用單元工作。但是,這不是保證。 – marvelTracker