3

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

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

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

更新本身的执行方式如下

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

i_oEntity 是自动映射的实体。

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

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

4

2 回答 2

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

于 2013-09-09T15:00:19.643 回答
-2

请更新OriginalValues->RowVersion,您将到达天堂 =)

于 2013-01-23T09:54:45.867 回答