【问题标题】:Entity Framework 6 Code First Concurrency实体框架 6 代码优先并发
【发布时间】:2014-05-02 05:57:57
【问题描述】:

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

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

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

或者我应该只使用 Rowversion 列吗?

【问题讨论】:

    标签: c# ef-code-first entity-framework-6


    【解决方案1】:

    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 - 由您决定是否捕获并相应地处理它。

    【讨论】:

    • 那么,将 ConcurrencyCheck 属性添加到单个列应该会导致 EF 增加它吗?我假设一列不会像您描述的那样导致性能下降。
    • @ScottD yes ,但随后将只检查那一列的并发性。通常最好使用时间戳
    • @rwisch45 我想说这仅取决于您的用例。行版本控制会导致非常令人沮丧的情况,您无法区分关键写入和非关键写入。说在没有适当上下文的情况下使用行版本控制通常比其他任何东西更好是错误的。
    猜你喜欢
    • 2014-03-23
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2014-05-23
    相关资源
    最近更新 更多