2012-02-23 72 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