实体框架 6 代码优先并发

Sco*_*ttD 3 c# ef-code-first entity-framework-6

我正在考虑将 Entity Framework 6 用于一个新项目。

当我们开发我们的表时,我们添加一个 int 类型的更新计数器,并且在执行更新时我们检查它没有改变并在成功更新时增加它。

从我读过的内容来看,我可以通过向更新计数器属性添加 ConcurrencyCheck 属性来进行检查,但是如何在成功更新时执行增量?

或者我应该只使用 Rowversion 列?

rwi*_*h45 6

这篇 Microsoft 博客文章包含指向许多 EF6 和 MVC 指南的链接。有一个你应该特别检查 -使用实体框架 6 处理并发。该指南使用的是 ASP.Net MVC 项目,但数据库原则应该适用于几乎所有类型的项目。

简而言之,如果您使用ConcurrencyCheck属性,那么您不必自己更新任何计数器 - 但它会增加应用程序数据库操作的开销,因为在幕后 EF 将推断每个 SQL 查询以包括对属性的并发检查您已将该ConcurrencyCheck属性应用于。如果您有一个非常大的表(很多列),这可能会导致应用程序性能变慢。

更好的方法是TimeStamp在代码优先类中使用字节数组属性上的属性(或者如果您使用的IsConcurrencyToken()是在属性上设置的 Fluent API )。然后,如果存在并发冲突,EF 将抛出一个DbUpdateConcurrencyException- 然后由您来捕获它并相应地处理它。

  • @rwisch45 我会说这仅取决于您的用例。行版本控制会导致非常令人沮丧的情况,您无法区分关键和非关键写入。说在没有适当上下文的情况下使用行版本控制通常更好是错误的。 (2认同)