0

我有一個應用程序使用EnterpriseLibrary和Unity,並在一個地方使用TransactionScope。這工作得很好,儘管它運行對SQL Server 2005的事實:EnterpriseLibrary,EF和交易範圍:爲什麼我看到不同的行爲?

// Execute a stored proc using a DbDatabase object inserted by Unity 

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    // Update something using the same DbDatabase object 
    // Run the stored proc above, again 
    // Assert that the results are different than from the previous call. 
} 

是的,這故意沒有scope.Complete()結束:例子是從測試。

我也有另一個應用剛剛開始。它使用實體框架4.1。它訪問同一臺服務器上的同一個數據庫。我試圖使用TransactionScope,同時「記住更改,驗證更改,回滾更改」的想法。

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    using(ProjectEntities db = new ProjectEntities()) 
    { 
     Assert.IsFalse(db.tblEntities.Any(e=>e.X == desired_value)); 

     db.tblEntities.Add(new tblEntity() { X = desired_value }); 
     db.SaveChanges(); 

     Assert.IsTrue(db.tblEntities.Any(e=> e.X == desired_value)); 

    } 
} 

由於MSDTC未被啓用用於網絡訪問,因此會失敗。

現在,這一分鐘,第一個項目的第一個測試成功,第二個測試失敗。

所以我有兩個問題:

  1. 有沒有辦法來rejigger我的第二次測試,將維持交易激化到MSDTC?

  2. 有人知道我爲什麼會從這兩個框架得到不同的結果嗎? EntLib是否保持分配的單個連接並在其使用的整個過程中打開? EF做相反的事情嗎?

回答

1

我已經做了很多關於EF,EntLib DAAB和TransactionScope的測試。

有幾點你必須考慮。

  • SQL Server版本
  • 連接字符串
  • EF和EntLib版本

我不記得其他組合,但在SQL Server 2008或更高版本,EF5和Entlib 5,您可以在相同的TransactionScope中註冊幾個DbContexts和DAAB操作,而無需調整MSDTC。但有一個非常棘手的部分:

  • 連接字符串必須包括:MultipleActiveResultSets = TRUE;
  • 連接字符串必須有EF

第二部分是最混亂使用的確切格式:當您使用一個連接字符串來EF,它將chaneg它的格式,但EntLib使用它就像在配置文件的連接字符串中一樣。所以,你必須做的是調試代碼,並記下EF使用的連接字符串的修改版本。你可以在ctx.Database.Connection.ConnectionString找到它,其中ctx是你正在使用的DbContext。完成之後,只需將修改後的連接字符串版本複製並粘貼到配置文件中,EF和EntLib將使用相同的連接字符串,從而不會升級到MSDTC。

對於先前版本的SQL Server(有時取決於EF版本),您可以找到不同的問題,但本指南可以幫助您測試確切的設置。

+0

謝謝!這非常有幫助! –

0

我不知道企業庫,但EF確實創建並打開每個查詢的新連接,我想這就是爲什麼你看到這些不同的結果。

您可以通過手動打開兩個DbConnections來驗證此情況。