我正在尝试实现乐观并发检查。我使用了通用存储库和工作单元格。
我已经向我的实体引入了一个Timestamp属性(作为字节数组),每当我更新数据时它会自动增加值(似乎是数据库管理,这应该是它应该做的)。
我通过将VM映射到实际模型(使用automapper)从视图模型加载更新的值。这会生成一个正确类型的实体的新(分离?)实例,并设置所有相应的字段(包括时间戳)。
更新本身就像
一样i_oOldEntity = m_oDbSet.Find(i_oEntity.MaterialId)
context.Entry(i_oOldEntity).CurrentValues.SetValues(i_oEntity)
context.SaveChanges()
i_oEntity是自动化实体。
这会更新值本身,但它会完全忽略来自viewmodel的时间戳值。生成的SQL代码使用WHERE子句中的最新rowversion值。
简而言之:如何在EF的WHERE子句中使用我的viewmodel-timestamp值?
答案 0 :(得分:0)
假设:
var target = dbContext.Employees.Find(dto.Id);
此技术使EF5在更新时在where子句中使用dto的Timestamp值,并且如果dto的Timestamp与数据库的Timestamp值不匹配,则会触发乐观并发异常:
context.Entry(target).Property(o => o.Timestamp).OriginalValue = dto.Timestamp;
context.Entry(target).Property(o => o.Timestamp).IsModified = true;
单独更新OriginalValue
在EF5中没有任何作用。
答案 1 :(得分:-2)
请更新OriginalValues->RowVersion
,您将进入天堂=)