Entity Framework 6 Code First 并发控制

4

我正在考虑在一个新项目中使用Entity Framework 6。

当我们开发表格时,我们会添加一个类型为int的更新计数器,当执行更新时,我们检查它是否已更改,并在成功更新后增加它。

根据我所了解的,我可以通过将ConcurrencyCheck属性添加到更新计数器属性来进行检查,但是如何在成功更新时进行增量操作?

或者我应该使用Rowversion列吗?

1个回答

6

这篇 Microsoft 博客文章 包含了许多 EF6 和 MVC 指南的链接。其中有一个特别值得一看 - 使用 Entity Framework 6 处理并发。该指南使用了 ASP.Net MVC 项目,但数据库原则适用于几乎任何类型的项目。

简而言之,如果您使用 ConcurrencyCheck 属性,则无需自己更新任何计数器 - 但它会增加应用程序数据库操作的开销,因为在底层,EF 将对您已应用 ConcurrencyCheck 属性的属性进行并发检查,从而推断每个 SQL 查询。如果您有一个非常大的表(很多列),这可能会导致较慢的应用程序性能。

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


因此,将ConcurrencyCheck属性添加到单个列中是否会导致EF也对其进行递增?我假设一个列不会像您描述的那样导致性能缓慢。 - ScottD
@ScottD 是的,但那样并发性只会针对该列进行检查。通常最好使用时间戳。 - rwisch45
2
@rwisch45 我认为这取决于您的使用情况。行版本控制可能会导致非常令人沮丧的情况,您无法区分关键写入和非关键写入。如果没有适当的上下文,仅仅说通常最好使用行版本控制而不是其他任何东西是谬误的。 - John Leidegren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接