I found MSDN 文章 http://msdn.microsoft.com/en-us/library/bb738618(v=vs.90).aspx描述了 EF 在保存更改时如何处理并发:
默认情况下[...]对象服务保存对象
对数据库的更改没有
检查并发性。为了
可能会经历
高并发,我们
建议实体属性为
在概念层中定义为
的一个属性
并发模式=“固定”
我有两个问题:
-
我的模型中没有属性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 期间并发检查的一部分。
即,当您更新人员时,您经常会看到如下所示的更新:
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' 属性。例外情况是当您有一个用于删除的 SPROC 不接受该并发值时。
希望这可以帮助
Alex
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)