我有一個問題想要分享。上下文有點混亂,所以我會盡力解釋。使用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錯誤(分佈式事務的支持被禁用)或者更爲罕見,因爲卸載域名。
我不知道是否有人能幫助我,至少要知道至極是對於這種情況最好的方向。
非常感謝,
看起來像entityconnection打開引擎蓋下的新連接。也許你可以勾上[StateChange](http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.statechange.aspx)以獲得更多細節。 – 2012-02-23 13:29:20
如果您連接到不同的數據庫(或者您正在使用Sql Server 2005),那麼您的事務將被提升爲分佈式事務。請注意,如果您使用的是Sql Server 2005,則事務將自動提升爲分佈式事務,因爲EF將多次打開連接。如果你想在多個上下文之間共享相同的連接,你應該在一個事務中打開連接(這應該會自動在事務中登記連接)並將連接傳遞給上下文ctor。 EF不會關閉它沒有打開的連接。 – Pawel 2012-02-26 06:21:47
請注意,自行打開連接也是一種防止將事務提升到Sql Server 2005上的分佈式事務的方法,因爲EF不會關閉並重新打開連接。 – Pawel 2012-02-26 06:22:50