实体框架支持SQL rowversion

时间:2014-03-05 09:44:02

标签: sql entity-framework rowversion

我的项目使用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确认“内置”并发或是否有另一种方式(配置,具体方法调用)使我的代码工作?

2 个答案:

答案 0 :(得分:5)

以下是答案(我已经给POC几周了):

    RowVersion中的
  1. TimeStamp(或SQL字段类型)是任何其他字段(强制和自我递增除外)。有一个特定的数据库处理它的更新值(即递增它),但没有特定的数据库处理比较它在更新前的值。
  2. 另一方面,
  3. EF允许您为每个字段(ConcurrencyMode)定义edmx。如果需要,您可以使用ConcurrencyMode=Fix(而不是默认的None)标记所有字段,从而在更新的where子句中包含所有字段(比较实体&#) 39;带有记录在数据库中的当前值的原始值)。但是,使用该模式为每个实体设置一个字段(即RowVersion字段)更容易。特别是因为维护它的唯一一方是数据库。
  4. 完成后,您确定会遇到System.Data.OptimisticConcurrencyException隔离错误。您仍然必须远离操作对象集的EF工作流,例如使用myObjectSet.Attach(myEntity),它会访问数据库以获取当前数据并将更改合并到其中。由于RowVersion字段通常不变,因此更新将使用数据库中的当前值触发,并且不会导致并发异常。

答案 1 :(得分:1)