gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:20:16 25 4
gpt4 key购买 nike

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

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

我通过将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com