7

我找到了一篇 MSDN 文章,描述了 EF 在保存更改时如何处理并发:

默认情况下 [...] 对象服务将对象更改保存到数据库而不检查并发性。对于可能遇到高度并发的属性,我们建议在概念层中定义实体属性,其属性为 ConcurrencyMode="fixed"

我有两个问题:

  1. 在我的模型中没有属性 where ConcurrencyMode="fixed",我可以安全地假设如果OptimisticConcurrencyException在保存更改时抛出 an ,那是因为实体不再存在于数据存储中,即它已被另一个用户删除,或者我是遗漏了什么?

    我想 EF 执行一个UPDATE看起来像这样的 -statement,在我看来,OptimisticConcurrencyException如果 ID = 1 的 Person 不存在,只会导致抛出:

     UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  2. 使用 时ConcurrencyMode="fixed",EF 在删除实体时是否也会检查并发性?换句话说,EF 是否会执行如下所示的DELETE- 语句(不仅仅是 - 子句中的主键WHERE):

     DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
4

1 回答 1

6

好问题。

(1) 是的,但不幸的是,事情并没有这么简单。因为 EF (3.5) 具有独立的关联模型,所以关联也被独立处理,即使您没有这么说,它也成为 UPDATES 和 DELETES 期间并发检查的一部分。

即,当您更新 Person 时,您经常会看到如下所示的更新:

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

ie Partner 是一个FK 列。

This all changes in 4.0 if you use FK associations, as we expect most people too.

(2) For DELETE any ConcurrencyMode = 'fixed' properties ARE checked during delete. The exception is when you have a SPROC for delete that doesn't accept that Concurrency values.

Hope this helps

Alex

于 2009-08-03T21:05:14.940 回答