带有日期时间的实体框架乐观并发异常

时间:2019-08-14 13:36:24

标签: c# entity-framework datetime entity-framework-6 ef-model-first

我已经为现有系统继承了旧版代码库。将添加一些新功能并修复错误,但不能更改数据库。

其中一个错误是,当尝试更新特定表中的记录时,出现异常:

System.Data.Entity.Core.OptimisticConcurrencyException: 'Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.'

该表具有一个复合主键,数据库中2个字段为tinyints,另一个字段为datetime。所使用的EF是使用Model First创建的,因此EDMX是从数据库构建的,并且当然将datetime映射到.NET DateTime

环顾其他问题,问题似乎出在DateTime映射上。即使我从数据库中获得一个实体,也要对其进行编辑并将其标记为EntityState.Modified,但是当我尝试回写时,它找不到匹配的记录,因为PK的datetime部分没有由于精度原因,与.NET DateTime的值匹配。其他建议是“将数据库中的datetime更改为datetime2”,但是按照指定的方式,我无法更改数据库。

我尝试在EDMX中将“ DateTime”的精度手动设置为0,3和7,但这没有影响。

>如何在不更改数据库的情况下让EF在这里创建正确的SQL语句,并且优选保留模型优先方法(因为它是复杂的EDMX,并且需要很长时间才能删除)?

1 个答案:

答案 0 :(得分:1)

我认为唯一的答案是使用存储的proc进行更新。您可以将该proc导入为实体函数,也可以仅使用EF直接调用它。

假定您说无法更改数据库时,您正在谈论架构。

如果您不能添加SP,则必须执行动态SQL,这实际上不是最好的主意。

谢谢, 加里