我找到了 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/