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,这确实不是最好的主意。
谢谢,
加里
我继承了现有系统的遗留代码库。待添加一些新功能,修复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,这确实不是最好的主意。
谢谢, 加里