我有一个问题想要分享。上下文有点混乱,所以我会尽力解释。使用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