实体框架实体更新忽略时间戳

时间:2012-10-08 09:52:22

标签: .net vb.net entity-framework optimistic-concurrency

我正在尝试实现乐观并发检查。我使用了通用存储库和工作单元格。

我已经向我的实体引入了一个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值?

2 个答案:

答案 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,您将进入天堂=)