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