管理EntityConnection生命週期

.net asp.net c# entityconnection entity-framework

管理EntityContext生命週期有很多問題,

例如, 在LINQ to Entities中實例化上下文

我得出的結論是,實體上下文應該被視為一個工作單元,因此不能重複使用。大。

但是在進行一些加速我的數據庫訪問的研究時,我遇到了這篇博文...

改善實體框架性能

該帖子稱,EF文件表現不佳相對於其他框架往往是由於EntityConnection對象被每次需要一個新的EntityContext對象時創建的。

為了測試這一點,我在Global.asax.cs Application_Start()中手動創建了一個靜態EntityConnection。

然後我使用語句將我的所有上下文轉換為

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

到目前為止,到目前為止,這似乎已經加快了一點點沒有任何錯誤。

但這樣安全嗎?

使用應用程序範圍的靜態EntityConnection是否會引入競爭條件?

最好的問候,凱文

一般承認的答案

記錄EntityConnection不是線程安全的 。我認為你可以集中它們,但你不能為Web應用程序使用單個靜態連接,因為會涉及很多線程。


熱門答案

  • 如果您的EF上下文是應用程序範圍的,請考慮用戶A已進行更改(未提交)並且用戶B已提交更改,所有更改將提交到數據庫,因為用戶A和B都使用相同的實例

  • 在我的項目中,我根據EF上下文執行了一次WebRequest - 即。上下文對像從Web請求的開始到結束都是靜態的,並且該請求中的所有操作都使用相同的EF上下文。這顯著加快了我的處理速度而沒有上述問題。

實現此目的的一種方法是使用DI容器(我使用Unity)來管理EF上下文的生命週期。每個Web請求生命週期管理器不是在Unity中開箱即用的,但是有大量的文章顯示瞭如何做到這一點。

HTH。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因