【问题标题】:Entity Framework Optimistic Concurrency exception with DateTimeDateTime 的实体框架乐观并发异常
【发布时间】:2019-08-14 13:36:24
【问题描述】:

我继承了现有系统的旧代码库。一些新功能要添加,要修复一些错误,但不能更改数据库。

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

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

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

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

我尝试在 EDMX 中手动将“日期时间”的精度设置为 0,3 和 7,但没有任何影响。如何在不更改数据库的情况下让 EF 在此处创建正确的 SQL 语句,并且出于偏好,保持模型优先的方法(因为它是一个复杂的 EDMX,需要很长时间才能删除)?

【问题讨论】:

  • 您为 EDMX 中的 Precision 属性尝试了哪些值? '3' 不起作用吗?
  • “我尝试在 EDMX 中手动将 'DateTime' 的精度设置为 0,3 和 7,但没有任何影响。”

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


【解决方案1】:

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

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

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

谢谢, 加里

【讨论】:

  • 谢谢 Gary,但我根本无法更改数据库;甚至添加SP。数据库实际上被多次复制并由另一个我无法控制的应用程序生成。我在想动态 SQL 将是唯一的方法,但我也真的不喜欢这个想法。
  • @MrShoes 那么你唯一的选择就是动态 SQL。
猜你喜欢
  • 2023-03-03
  • 2015-06-27
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多