我的项目使用EF(使用自我跟踪模板测试版本4,使用默认模板测试版本5,所有数据库优先)针对SQL Server 2012.数据库表格各有一个rowversion
({{1列定义。
在其中使用EF核心,这意味着我的数据库更新代码看起来如此:
timestamp
不会触发任何using (var db = new MyContext())
{
//db.Entry(myInstance).State = EntityState.Modified;
db.SaveChanges();
}
警报。我运行并行客户端,每个客户端读取相同的记录,对其进行更改,然后将每个客户端写入数据库。接受所有更新,不应用并发。
我是否必须使用我的更新命令的存储过程(使用where子句表示我的rowversion
值)以使EF确认“内置”并发或是否有另一种方式(配置,具体方法调用)使我的代码工作?
答案 0 :(得分:5)
RowVersion
中的TimeStamp
(或SQL
字段类型)是任何其他字段(强制和自我递增除外)。有一个特定的数据库处理它的更新值(即递增它),但没有特定的数据库处理比较它在更新前的值。EF
允许您为每个字段(ConcurrencyMode
)定义edmx
。如果需要,您可以使用ConcurrencyMode=Fix
(而不是默认的None
)标记所有字段,从而在更新的where子句中包含所有字段(比较实体&#) 39;带有记录在数据库中的当前值的原始值)。但是,使用该模式为每个实体设置一个字段(即RowVersion
字段)更容易。特别是因为维护它的唯一一方是数据库。System.Data.OptimisticConcurrencyException
隔离错误。您仍然必须远离操作对象集的EF
工作流,例如使用myObjectSet.Attach(myEntity)
,它会访问数据库以获取当前数据并将更改合并到其中。由于RowVersion
字段通常不变,因此更新将使用数据库中的当前值触发,并且不会导致并发异常。答案 1 :(得分:1)