.net - ADO.NET Entity Framework 中的乐观并发

标签 .net entity-framework optimistic-concurrency

我找到了 an MSDN article描述了 EF 在保存更改时如何处理并发:

By default [...] Object Services saves object changes to the database without checking for concurrency. For properties that might experience a high degree of concurrency, we recommend that the entity property be defined in the conceptual layer with an attribute of ConcurrencyMode="fixed"


我有两个问题:
  • 我的模型中没有属性,其中 ConcurrencyMode="fixed" ,我可以安全地假设,如果有 OptimisticConcurrencyException保存更改时抛出,这是因为该实体不再存在于数据存储中,即它已被其他用户删除,还是我遗漏了什么?
    我想象 EF 执行 UPDATE - 看起来像这样的语句,在我看来,它只会导致 OptimisticConcurrencyException如果 ID = 1 的 Person 不存在,则抛出:
     UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  • 使用时 ConcurrencyMode="fixed" , EF 在删除实体时是否也会检查并发性?换句话说,EF 是否会执行 DELETE - 看起来像这样的语句(不仅仅是 WHERE -子句中的主键):
     DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
  • 最佳答案

    好问题。

    (1) 是的,但不幸的是它并不那么简单。因为 EF (3.5) 有一个独立的关联模型,所以关联也被独立处理,即使你没有这么说,它也成为 UPDATES 和 DELETES 期间并发检查的一部分。

    即,当您更新 Person 时,您经常会看到如下所示的更新:

    UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith' 
    WHERE ID = 1 AND Partner = 2
    

    即合作伙伴是一个 FK 列。

    如果您使用 FK 关联,这一切在 4.0 中都会发生变化,正如我们对大多数人的预期。

    (2) 对于 DELETE,在删除期间检查任何 ConcurrencyMode = 'fixed' 属性。异常(exception)情况是当您有一个不接受该并发值的删除 SPROC 时。

    希望这可以帮助

    亚历克斯

    关于.net - ADO.NET Entity Framework 中的乐观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1221975/

    相关文章:

    c# - 从 DataGrid 中选择 DataGridCell

    .net - 多线程委托(delegate)/事件

    c# - 无法加载文件或程序集 'EntityFramework,版本 = 6.0.0.0,

    c# - SQL Azure Federation 和 EF Code First 数据库生成?

    java - 覆盖数据库的值,独立于

    c# - 是否有类似于 GNU readline 的 .Net 库?

    c# - 如何合并 ThreadLocal<T> 中的所有值?

    c# - ASP.NET MVC Image 使用 Entity Framework 在数据库上上传和创建记录

    RESTful API 和批量操作

    sql-server - 在更新语句中获取最新的行版本/时间戳值 - Sql Server