Entity Framework DateTime 的乐观并发异常

Entity Framework Optimistic Concurrency exception with DateTime

我继承了现有系统的遗留代码库。待添加一些新功能,修复bug,但无法更改数据库。

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

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.'

问题中的table在数据库中有一个复合主键,2个字段是tinyints,另一个是datetime。使用的 EF 是使用 Model First 创建的,因此 EDMX 是从数据库构建的,当然会将 datetime 映射到 .NET DateTime.

查看其他问题,问题似乎出在 DateTime 映射上;即使我从数据库中获取一个实体,对其进行编辑并将其标记为 EntityState.Modified,当我尝试回写时它也找不到匹配的记录,因为 PK 的 datetime 部分没有匹配 .NET DateTime 的值 - 由于精度。其他建议是 "change the datetime to datetime2 in the database",但按照规定我无法更改数据库。

我已经尝试在 EDMX 中手动将 'DateTime' 的精度设置为 0,3 和 7,但没有任何效果。我如何才能让 EF 在此处创建正确的 SQL 语句而不更改数据库,并且优先考虑保持模型优先的方法(因为它是一个复杂的 EDMX 并且需要很长时间才能删除)?

我认为唯一的答案是使用存储过程来进行更新。您可以将该过程作为实体函数导入,或者只使用 EF 直接调用它。

假设当您说无法更改数据库时,您指的是架构。

如果您不能添加 SP,那么您将不得不执行动态 SQL,这确实不是最好的主意。

谢谢, 加里