我发现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/