2010-04-04 60 views
7

已經有關於管理的EntityContext一生許多問題,管理EntityConnection一生

例如Instantiating a context in LINQ to Entities

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

但在做一些研究,對於加快我的數據庫訪問,我碰到這個博客帖子...

Improving Entity Framework Performance

員額認爲的EF表現不佳相對於其他框架往往是由於EntityConnection每次創建對象時需要新的對象EntityContext

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

我然後轉換使用陳述我的所有方面

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

這似乎已經加快了一點東西,沒有任何錯誤,到目前爲止,據我可以告訴。

但這是安全的嗎?

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

最好的問候, Kervin

+0

這可能會開始一場神聖的戰爭。 ;) – Nix 2010-04-04 18:44:36

回答

7

EntityConnection is documented to be not thread-safe。我認爲你可以將它們集中起來,但是你不能爲Web應用程序使用單一的靜態連接,因爲會涉及許多線程。

+0

謝謝。我確信這不會那麼容易,但我非常想弄清楚,如果有人在那裏爲性能彙集連接。由於該MSDN博客文章爲此提供了相當的案例。 – kervin 2010-04-05 16:15:43

+0

如果不在.NET 4中重新測試,我不會改變任何東西。這可能已經被解決了。 – 2010-04-05 16:27:09

2
  • 如果你的EF上下文是應用程序範圍內,考慮到用戶A進行了更改(不提交)&用戶B已經承諾他的變化,所有的變化將得到承諾該數據庫,因爲用戶A & B使用相同的實例

  • 在我的項目中,我做了每個WebRequest實例的EF上下文 - 即。上下文對象從Web請求的開始到結束都是靜態的&該請求中的所有操作都使用相同的EF上下文。這顯着加快了我的處理速度,而沒有出現上述問題。

實現此目的的一種方法是使用DI容器(我使用Unity)來管理EF上下文的生存期。每個Web請求生存期管理器並非在Unity中開箱即用,但有大量文章顯示如何完成此操作。

HTH。

+1

嗨,謝謝,但我的EntityContext不是應用程序範圍。它使用的EntityConnection是。我使用EntityContext作爲「工作單元」,即。基本上每個訪問都有一個新的環境。 – kervin 2010-04-04 18:59:17