2015-06-19 137 views
6

在我已經繼承的應用程序中,這是基本控制器中的應用程序中的每個其他控制器都從中繼承。DbContext和連接池

public BaseController() 
    { 
     db = new MyDbContext(); 

     db.Database.Log = s => Debug.Write(s); 
    } 

public MyDbContext() 
     : base("name=MyDbContext") 
    { 
     // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
     var instance = SqlProviderServices.Instance; 
    } 

由於應用程序已經被設計的方式,至少2個上下文每個請求創建。 (這是一個MVC應用程序,每個頁面上都有一個HomeController的調用,以及任何其他控制器被調用的特定頁面。)

我的問題是什麼時候DbContext創建到SQL Server的連接?立即創建上下文時,還是僅在執行查詢時?

如果是前者,那麼我將使用連接到SQL服務器的連接數量的兩倍,而不是所需的連接數量,如果是後者,那麼這可能不是太多問題。

我不認爲我可以在不久的將來重構這個,當然不是沒有道理的。我應該注意到這種設計有哪些潛在的缺陷?

實體框架6.1.3

+0

哪個版本的EF的是什麼?你能告訴我們MyDbContext的構造函數嗎?這將給出解答你的問題所需的細節。 – sstan

+0

更新了問題 – MrBliz

回答

3

因爲您不是試圖在您的上下文的構造函數中自己創建並傳遞連接,那麼,就像其他人所說的那樣,EF將根據需要從連接池中獲取/釋放連接,而不是在構建連接時進行連接。

注意這句話從EF文件:

連接

默認情況下,上下文管理到數據庫的連接。上下文根據需要打開和關閉連接。例如,上下文打開一個連接來執行查詢,然後在處理完所有結果集後關閉連接。

有些情況下,當您想要在連接打開和關閉時有更多的控制權。例如,使用SQL Server Compact時,打開和關閉相同的連接非常昂貴。您可以使用Connection屬性手動管理此過程。

請參見以下鏈接瞭解更多信息:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

1

連接僅在執行查詢時打開。連接池由ADO.NET類(SqlConnection)管理。每個請求有多個DbContext實例是可以的,有時也是必需的。一般來說,連接數不會超過兩次。

3

實體框架遵循開放遲到和關閉早期原則。所以,它只在需要的時候纔打開連接,IE實現查詢,然後儘快關閉它。

如果可以,您應該移動到每個請求的單個上下文實例。這也可以將請求期間發生的所有事情保存在單個事務中。如果您使用依賴注入容器來實例化控制器,則可以非常輕鬆地完成此操作。