我不同意所有四點:
被自動關閉/設置防止連接(將在使用塊的結尾關閉 )。
在我看來,如果在方法級別,存儲庫實例級別或請求級別上處理上下文,則無關緊要。 (你有當然在單個請求結束時處理上下文 - 通過將存儲庫方法包裝在using
聲明中或通過在存儲庫類上實現IDisposable
(如您所建議的)並將存儲庫實例包裝在using
語句或通過在控制器構造函數中實例化存儲庫並將其置於控制器類的重寫中 - 或者在請求開始時通過實例化上下文並在請求結束時進行處理(某些依賴注入容器將有助於做這個工作)。)爲什麼上下文應該「自動處理」?在桌面應用程序中,每個窗口/視圖都有一個可能會打開幾個小時的上下文是可能的和常見的。
有助於迫使你只能拉入內存,你需要什麼樣的 特定視圖/視圖模型,並在更短的往返(你會得到任何你試圖延遲加載一個 連接錯誤)。
老實說,我會通過完全禁用延遲加載來強制執行此操作。我沒有看到在客戶端與服務器斷開連接的Web應用程序中進行延遲加載的好處。在你的控制器動作中,你總是知道你需要加載什麼,並且可以使用急切或顯式加載。爲避免內存開銷並提高性能,您可以始終禁用GET請求的更改跟蹤,因爲EF無論如何都無法跟蹤客戶端網頁上的更改。
控制器內的子實體的訪問/查看僅限於什麼 你調用包括()
這是相當具有優勢不是一個劣勢,因爲你沒有的unwished驚喜延遲加載。如果您需要在控制器動作後填充子實體,這取決於一些條件,你可以通過額外的儲存庫的方法(LoadNavigationProperty
或東西)具有相同或甚至一個新的上下文加載它們。
對於像儀表板指數顯示,從 許多表(很多不同的版本庫的方法調用)收集的信息的網頁,我們將添加 開銷創建和處理許多實體容器。
創建上下文 - 我不認爲我們正在談論數百或數千個實例 - 是一種便宜的操作。我認爲這是一個非常理論化的開銷,在實踐中沒有發揮作用。
我使用這兩種方法,你在web應用中提到,也是第三個選項,即創建每個請求一個上下文並注入同樣的情況下到每一個存儲庫/服務,我需要在一個控制器動作。他們三人都爲我工作。
當然,如果你使用,你必須要小心做同一個工作單位的各項工作,以避免安裝實體多個上下文,這將導致衆所周知的例外多個上下文。避免這種情況通常不是問題,但需要更多的關注,特別是在處理POST請求時。
我最近使用每個請求的上下文,因爲它更容易,我只是沒有看到有非常狹窄的上下文的好處,我沒有理由在整個請求處理中使用多個工作單元。如果我需要多個上下文 - 無論出於何種原因 - 我總是可以創建專門的方法來處理它們自己的上下文,而不是請求的「默認上下文」。
關閉主題?真的嗎?我可以看到關閉不是建設性的(雖然我也會反對這一點,但肯定比「off topic」更準確) – 2012-04-18 17:51:02