ADO.NET实体框架中的乐观并发

时间:2009-08-03 12:08:21

标签: .net entity-framework optimistic-concurrency

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

  

默认情况下[...] Object Services保存对象   更改数据库没有   检查并发性。对于   可能会遇到的属性   高度的并发性,我们   建议实体属性   在概念层中定义   的属性   ConcurrencyMode = “固定”

我有两个问题:

  1. 我的模型中没有ConcurrencyMode="fixed"的属性,我可以安全地假设在保存更改时抛出OptimisticConcurrencyException,这是因为实体不再存在数据存储,即它已被其他用户删除,或者我错过了什么?

    我想EF正在执行UPDATE - 这样的语句,正如我所看到的那样,如果ID = 1的Person不会引发OptimisticConcurrencyException存在:

    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'
    

1 个答案:

答案 0 :(得分: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

即。合作伙伴是FK专栏。

如果你使用FK关联,这一切都会在4.0中发生变化,正如我们对大多数人的期望一样。

(2)对于DELETE,在删除期间检查任何ConcurrencyMode ='fixed'属性。例外情况是当您有一个不接受该并发值的SPROC for delete时。

希望这有帮助

亚历