.net - Entity Framework 实体更新忽略时间戳

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

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

我在我的实体中引入了一个时间戳属性(作为字节数组),它会在我更新数据时自动增加值(似乎是数据库管理的,这是它应该做的)。

我通过将 VM 映射到实际模型(使用自动映射器)从 View 模型加载更新值。这会生成正确类型的实体的新(分离的?)实例,并设置了所有相应的字段(包括时间戳)。

更新本身是这样执行的

i_oOldEntity =  m_oDbSet.Find(i_oEntity.MaterialId)
context.Entry(i_oOldEntity).CurrentValues.SetValues(i_oEntity)
context.SaveChanges()

i_oEntity 是自动映射的实体。

这会很好地更新值本身,但是它完全忽略了来自 View 模型的时间戳值。生成的 SQL 代码在 WHERE 子句中使用最新的 rowversion 值。

简而言之:如何让我的 viewmodel-timestamp 值在 EF 的 WHERE 子句中使用?

最佳答案

假设:

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 中执行任何操作。

关于.net - Entity Framework 实体更新忽略时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779259/

相关文章:

entity-framework - 删除具有一对多关系的 child 的 parent

.net - 将 CancellationToken 添加到 WebApi 导致 415

c# - C#.NET 中有没有办法将字符串分解为固定长度的子字符串?

c# - 存储库模式只能与 Entity Framework 一起使用吗?

vb.net - 如何抑制 file.delete 上的错误消息?

vb.net - 为什么这个多线程VB.NET(2010 Express Edition)程序不能正常工作?

c# - 初始化 Entity Framework 上下文的最佳方法?

.net - 用正则表达式匹配数字——只有数字和逗号

c# - 在 asp.net WebService 中未调用 Application_End 时

vb.net - 将函数声明为私有(private)与公有之间有什么实际区别?