代码之家  ›  专栏  ›  技术社区  ›  bernhof

ADO.NET实体框架中的乐观并发

  •  7
  • bernhof  · 技术社区  · 15 年前

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

    默认情况下,[…]对象服务保存对象 对数据库的更改 检查并发性 . 对于 可能发生故障的属性 建议使用实体属性 在概念层中使用 属性 ConcurrencyMode=“已修复”

    1. 在我的模型中没有属性,其中 ConcurrencyMode="fixed" ,对我来说,假设 OptimisticConcurrencyException 在保存更改时引发,这是因为该实体不再存在于数据存储中,即它已被其他用户删除,或者我缺少什么?

      我想象EF执行一个 UPDATE -语句看起来像这样,在我看来,这只会导致 乐观并发例外

       UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
      
    2. ConcurrencyMode=“已修复” ,在删除实体时EF是否也检查并发性?换句话说,EF是否会执行 DELETE -语句(在 WHERE -条款):

       DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
      
    1 回复  |  直到 4 年前
        1
  •  6
  •   Alex James    15 年前

    (1) 是的,但不幸的是,事情并非如此简单。因为EF(3.5)有一个独立的关联模型,所以关联也被独立处理,即使您没有这样说过,它也会成为更新和删除期间并发性检查的一部分。

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

    i、 e.合作伙伴是一个FK列。

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

    (2) 对于DELETE any ConcurrencyMode=“fixed”属性在删除过程中被选中。例外情况是,当您的“删除”存储过程不接受该并发值时。

    希望这有帮助

    亚历克斯