【问题标题】:Doing transactions with Entity Framework Code First首先使用实体​​框架代码进行事务
【发布时间】:2013-02-03 09:14:58
【问题描述】:

有一个答案here解释如何用Entity Framework做事务 但是,该解决方案不适用于代码。 我已经进行了实验,我的测试表明以下方法确实有效

using (var scope = new TransactionScope())
{
        DBContext1.SaveChanges()
        If (ForceFailure) return 0  // used in testing
        DBContext2.SaveChanges()
        scope.Complete();
 }

但是我感到紧张,因为我不再将参数传递给 SaveChanges 或调用 AcceptAllChanges

如何确定我是否可以信任我的解决方案?

【问题讨论】:

  • 您不信任哪些方面(数据库一致性、上下文一致性等)?
  • 我想知道 savechanges 要么运行要么都不运行。我的测试表明情况确实如此。然而,由于代码似乎与早期的 EF 版本如此不同,我正在寻找一些同行或文档验证。

标签: entity-framework-5 transactionscope


【解决方案1】:

SaveChanges(Boolean)ObjectContext 的一部分,而不是DbContext。请注意,ObjectContext 中的方法 SaveChanges(Boolean) 已被弃用,取而代之的是 SaveChanges(SaveOptions)

如果您仍想使用DbContext,您可以重载自己的SaveChanges 方法以使用IObjectContextAdapter.ObjectContext,例如使用扩展方法。

【讨论】:

  • DbContext 确实有一个 SaveChanges 方法
  • 确实如此,但它不是同一种方法(DbContext 不扩展ObjectContext),这就是它缺少您需要的参数的原因。但是,您可以通过DbContext 实现的IObjectContextAdapter 接口检索对DbContext 内部使用的ObjectContext 的引用,并使用您需要的SaveChanges 方法。
  • 您能告诉我您在哪里发现 DBContext SaveChanges 已被弃用吗?我找到了相反的参考资料——但不是来自微软。
  • 我说的是来自ObjectContextSaveChanges(Boolean),而不是来自DbContext 的那个。让我澄清一下:有两种方法,ObjectContext.SaveChangesDbContext.SaveChangesObjectContext.SaveChanges 被重载,它的一个变体(接受布尔值的那个)被弃用,取而代之的是另一个变体(接受SaveOptions 的那个)。这与DbContext.SaveChanges无关。
  • ObjectContextDbContext 实际上是两个不同的 API,尽管目标相似。据我所知,DbContext 是在ObjectContext 之后创建的,主要为代码优先场景提供更简单的 API(消除了ObjectContext 需要的一些样板文件的需要)——事实上,正如我已经暗示的那样,@ 987654352@ 实际上在内部使用ObjectContext,因此它实际上是一个包装器。可能还有其他原因,请参阅stackoverflow.com/search?q=objectcontext+vs+dbcontext。理论上你不需要ObjectContext.SaveChanges,但你可能遇到了限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多