我正在考虑将Entity Framework 6用于新项目。
当我们开发表时,我们添加一个int类型的更新计数器,当执行更新时,我们检查它是否没有更改并在成功更新时增加它。
根据我的阅读,我可以通过向更新计数器属性添加ConcurrencyCheck属性来进行检查,但是如何在成功更新时执行增量?
或者我应该只使用Rowversion列吗?
答案 0 :(得分:3)
This Microsoft blog post包含许多EF6和MVC指南的链接。特别值得一提的是 - Handling Concurrency with the Entity Framework 6。该指南使用的是ASP.Net MVC项目,但数据库原则应适用于几乎任何类型的项目。
简而言之,如果您使用ConcurrencyCheck
属性,那么您不必自己更新任何计数器 - 但它会为您的应用程序的数据库操作增加更多开销,因为它在引擎盖下EF将推断每个SQL查询,以包括已应用ConcurrencyCheck
属性的属性的并发检查。如果您有一个非常大的表(许多列),这可能会导致应用程序性能降低。
更好的方法是在代码优先类的字节数组属性上使用TimeStamp
属性(或者如果您使用的是Fluent API,则在属性上设置IsConcurrencyToken()
)。然后,如果存在并发冲突,EF会抛出一个DbUpdateConcurrencyException
- 它取决于你,然后抓住它并相应地处理它。