2011-07-19 96 views
12

我試圖重新使用現有的數據庫連接,以便可以使用TransactionScope執行多個數據庫操作,而無需調用MSDTC。DbContext將不會保持連接打開以供重新使用

實體框架(在4.1版本中使用新的DbContext API)似乎並不希望保持打開明確打開的連接。舊的ObjectContext API保持連接按預期打開並documented

由於DbContext API只是在底層使用ObjectContext,所以我期望有相同的行爲。有誰知道這個改變是有意的還是一個已知的問題?我無法在任何地方找到它。

public void ConnectionRemainsOpen() 
{ 
    using (var context = new TestDataContext()) 
    { 
     try 
     { 
      Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State); 

      context.Database.Connection.Open(); 

      var firstRecord = context.Table3.FirstOrDefault(); 

      // this Assert fails as State == ConnectionState.Closed 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 

      var newRecord = new Table3 
      { 
       Name = "test", 
       CreatedTime = DateTime.UtcNow, 
       ModifiedTime = DateTime.UtcNow 
      }; 

      context.Table3.Add(newRecord); 

      context.SaveChanges(); 

      // this Assert would also fail 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 
     } 
     finally 
     { 
      if (context.Database.Connection.State == ConnectionState.Open) 
       context.Database.Connection.Close(); 
     } 
    } 
} 
+0

如果在Open()之後但在第一個查詢之前放置一個Assert,那麼結果是什麼?我想知道這裏的問題實際上只是它返回了一個錯誤的值,而不是實際關閉和重新打開連接。 – Tridus

+0

@Tridus,您建議的斷言會傳遞「Open」的預期結果。 – GWB

+0

我意識到這是一箇舊帖子,但我只是讀Julia Lerman的書,她使用的語法是context.Connection.Open()(即上下文和Connection之間沒有數據庫)。只是一個想法。 – Tod

回答

14

如果你想控制連接,你必須在上下文之前創建它並傳遞給上下文,否則連接不受你控制。嘗試類似:

using (var connection = ...) 
{ 
    using (var context = new TestDataContext(connection, false)) 
    { 
     ... 
    } 
} 
+0

這是EF 4.0和4.1之間的文檔更改嗎? – GWB

+0

我認爲這是記錄,因爲構造函數的第二個參數告訴如果上下文擁有連接。 –

+0

我試過你的解決方案,但得到相同的結果。上下文仍會根據需要更改連接狀態。 – GWB