我正在考虑在一个新项目中使用Entity Framework 6。
当我们开发表格时,我们会添加一个类型为int的更新计数器,当执行更新时,我们检查它是否已更改,并在成功更新后增加它。
根据我所了解的,我可以通过将ConcurrencyCheck属性添加到更新计数器属性来进行检查,但是如何在成功更新时进行增量操作?
或者我应该使用Rowversion列吗?
我正在考虑在一个新项目中使用Entity Framework 6。
当我们开发表格时,我们会添加一个类型为int的更新计数器,当执行更新时,我们检查它是否已更改,并在成功更新后增加它。
根据我所了解的,我可以通过将ConcurrencyCheck属性添加到更新计数器属性来进行检查,但是如何在成功更新时进行增量操作?
或者我应该使用Rowversion列吗?
这篇 Microsoft 博客文章 包含了许多 EF6 和 MVC 指南的链接。其中有一个特别值得一看 - 使用 Entity Framework 6 处理并发。该指南使用了 ASP.Net MVC 项目,但数据库原则适用于几乎任何类型的项目。
简而言之,如果您使用 ConcurrencyCheck
属性,则无需自己更新任何计数器 - 但它会增加应用程序数据库操作的开销,因为在底层,EF 将对您已应用 ConcurrencyCheck
属性的属性进行并发检查,从而推断每个 SQL 查询。如果您有一个非常大的表(很多列),这可能会导致较慢的应用程序性能。
更好的方法是在您的 Code First 类中的字节数组属性上使用 TimeStamp
属性(或者如果您使用 Fluent API,则在属性上设置 IsConcurrencyToken()
)。然后,如果存在并发冲突,EF 将抛出一个 DbUpdateConcurrencyException
异常 - 您需要捕获并相应地处理它。