使用SaveChanges和ExecuteStoreCommand进行事务操作

时间:2012-02-23 11:16:59

标签: c#-4.0 entity-framework-4.1 ef-code-first

我有一个问题,我想分享。上下文有点混乱,所以我会尽力在解释中。

我需要在许多实体上创建一个事务操作。我正在使用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 个答案:

答案 0 :(得分:7)

看看这个答案:
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();
}