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

我有两个问题:

  • 在我的模型中没有ConcurrencyMode="fixed"的属性,对于我来说可以安全地假设,如果在保存更改时抛出了OptimisticConcurrencyException,那是因为该实体不再存在于数据存储中,即该实体已被另一个用户删除,还是我错过了什么?
    我想象EF会执行一个类似于UPDATE的语句,就像我看到的那样,如果不存在ID = 1的人,这只会导致OptimisticConcurrencyException的抛出:
     UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  • 使用ConcurrencyMode="fixed"时,删除实体时EF是否还会检查并发性?换句话说,EF是否会执行如下所示的DELETE-语句(不只是WHERE -clause中的主键):
     DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
  • 最佳答案

    好问题。

    (1)是的,但不幸的是,事情并非如此简单。因为EF(3.5)具有独立的关联模型,所以关联也被独立对待,即使您没有说过,它也成为UPDATES和DELETES过程中并发检查的一部分。

    即,当您更新某个人物时,您通常会看到如下所示的更新:

    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/

    10-13 02:23