【问题标题】:Transactional operation with SaveChanges and ExecuteStoreCommand使用 SaveChanges 和 ExecuteStoreCommand 的事务操作
【发布时间】:2012-02-23 11:16:58
【问题描述】:

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

我需要在多个实体上创建事务操作。我正在使用 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 以获取更多详细信息。
  • 如果您连接到不同的数据库(或者您使用的是 Sql Server 2005),您的事务将被提升为分布式事务。请注意,如果您使用的是 Sql Server 2005,则事务会自动提升为分布式事务,因为 EF 将多次打开连接。如果您想在多个上下文之间共享相同的连接,您应该在事务中打开连接(这应该自动在事务中登记连接)并将连接传递给上下文 ctor。 EF 不会关闭它没有打开的连接。
  • 请注意,自行打开连接也是一种防止将事务提升为 Sql Server 2005 上的分布式事务的方法,因为 EF 不会关闭并重新打开连接。

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


【解决方案1】:

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

【讨论】:

  • 当上下文超出范围时,即在 using 语句结束时,连接会自动关闭。
猜你喜欢
  • 2010-10-23
  • 2014-09-07
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多