我找到了 MSDN的文章 它描述了如何EF处理并发当保存的变化:

通过默认[...]服务对象节省的对象 变化的数据库 没有 检查并发.对于 性可能会遇到一个 高度的并发,我们 建议该实体的财产 定义在概念层 一个属性 ConcurrencyMode="固定的"

我有两个问题:

  1. 有没有属性,在我的模特在哪里 ConcurrencyMode="fixed", ,它是安全的我认为,如果没有一个 OptimisticConcurrencyException 扔的时候节变化,这是因为该实体不再存在的数据存储,即它已经被删除的另一个用户,还是我失去了一些东西?

    我想EF执行 UPDATE-声明,看起来像这样的东西,这正如我所看到的,只会导致 OptimisticConcurrencyException 被抛如果该人与ID=1并不存在:

    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)是的,但不幸的是,它不是这么简单。因为EF(3.5)具有一个独立的关联模式,该协会是独立处理过,而且即使你没说所以它成为的一部分,并发检查期间,更新和删除。

即在更新一个人你会经常看到的更新,这样的:

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

即合作伙伴是一个FK列。

这所有的更改在4.0如果使用FK协会,作为我们预计大多数人。

(2)删除任何ConcurrencyMode='固定的'性质的检查过删除。唯一的例外是当你有一个SPROC于删除,不接受,并发价值。

希望这可以帮助

亚历克斯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top