2012-02-23 42 views
4

我有一個問題想要分享。上下文有點混亂,所以我會盡力解釋。使用SaveChanges和ExecuteStoreCommand進行交易操作

我需要在多個實體上創建一個事務操作。我正在使用EF CodeFirst,但使用了一個我無法更改的遺留數據庫。爲了創建比數據庫提供的更一致的模型,我將數據庫信息投影到我自己創建的更精緻的實體中。

,因爲我需要使用不同的背景下,我最初的想法是使用的TransactionScope至極給了我在過去的好成績。爲什麼我需要不同的環境?由於db的各種問題,我不能只在一個操作(UnitOfWork)中進行更新。我需要檢索僅在SaveChanges()後出現的不同ID。

using (var scope = new TransactionScope()) 
{ 
    Operation1(); 
    Operation2(); 
    Operation3(uses ExecuteStoreCommand) 
    SaveChanges(); 

    Operation4(); 
    SaveChanges(); 
} 

我知道,爲了使用的TransactionScope,我需要共享所有的操作中相同的連接(我這樣做,傳遞上下文的對象)。然而,當我執行的操作之一(至極使用ExecuteStoreCommand)或我嘗試了第一次的SaveChanges後做一些更新,我總是收到MSDTC錯誤(分佈式事務的支持被禁用)或者更爲罕見,因爲卸載域名

我不知道是否有人能幫助我,至少要知道至極是對於這種情況最好的方向。

非常感謝,

+1

看起來像entityconnection打開引擎蓋下的新連接。也許你可以勾上[StateChange](http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.statechange.aspx)以獲得更多細節。 – 2012-02-23 13:29:20

+0

如果您連接到不同的數據庫(或者您正在使用Sql Server 2005),那麼您的事務將被提升爲分佈式事務。請注意,如果您使用的是Sql Server 2005,則事務將自動提升爲分佈式事務,因爲EF將多次打開連接。如果你想在多個上下文之間共享相同的連接,你應該在一個事務中打開連接(這應該會自動在事務中登記連接)並將連接傳遞給上下文ctor。 EF不會關閉它沒有打開的連接。 – Pawel 2012-02-26 06:21:47

+0

請注意,自行打開連接也是一種防止將事務提升到Sql Server 2005上的分佈式事務的方法,因爲EF不會關閉並重新打開連接。 – Pawel 2012-02-26 06:22:50

回答

6

看一看這個答案:
Entity Framework - Using Transactions or SaveChanges(false) and AcceptAllChanges()?
答案做您需要有一個交易,在多個數據上下文是什麼。

這個職位上Transactions and Connections in Entity Framework 4.0我發現確實也有幫助。

對於誰可能需要一個簡單的解決方案的人,這是我用的時候我需要在一個事務中混合ExecuteStoreCommand和調用SaveChanges。

using (var dataContext = new ContextEntities()) 
{ 
    dataContext.Connection.Open(); 
    var trx = dataContext.Connection.BeginTransaction(); 

    var sql = "DELETE TestTable WHERE SomeCondition"; 
    dataContext.ExecuteStoreCommand(sql); 

    var list = CreateMyListOfObjects(); // this could throw an exception 
    foreach (var obj in list) 
     dataContext.TestTable.AddObject(obj); 
    dataContext.SaveChanges(); // this could throw an exception 

    trx.Commit(); 
} 
+0

這是非常奇妙的信息,非常感謝Ralph – IoChaos 2012-09-12 15:26:45

+1

當上下文超出範圍時,即在using語句結束時,連接將自動關閉。 – 2012-10-04 13:49:56

+0

謝謝,更新! – 2012-10-04 15:55:04