实体框架:“存储更新,插入或删除语句影响了意外的行数(0)。”

entity-framework

我正在使用Entity Framework来填充网格控件。有时当我进行更新时,我收到以下错误:

存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

我无法弄清楚如何重现这一点。但它可能与我进行更新的距离有多大关系。有没有人看过这个或有没有人知道错误信息是指什么?

编辑:不幸的是我不再自由地重现我在这里遇到的问题,因为我离开了这个项目并且不记得我是否最终找到了解决方案,如果另一个开发人员修复了它,或者我是否解决了这个问题。因此我不能接受任何答案。

一般承认的答案

这是一种称为乐观并发的功能的副作用。

不是100%确定如何在实体框架中打开/关闭它,但基本上它告诉你的是,当你从数据库中抓取数据和保存更改时,其他人已经更改了数据(这意味着当你去了保存它0行实际上已更新)。在SQL术语中,它们的update查询的where子句包含行中每个字段的原始值,如果0行受到影响,则它知道出错了。

它背后的想法是你不会最终覆盖你的应用程序不知道发生的变化 - 这基本上是.NET在你所有更新中引入的一点安全措施。

如果它是一致的,则可能在你自己的逻辑中发生(EG:你实际上是在选择和更新之间的另一种方法中自己更新数据),但它可能只是两个应用程序之间的竞争条件。


热门答案

我遇到了这个问题,这是由实体的ID(密钥)字段未设置引起的。因此,当上下文保存数据时,它找不到ID = 0.确保在update语句中放置一个断点并验证是否已设置实体的ID。

来自Paul Bellora的评论

我有这个确切的问题,因为忘记在.cshtml编辑页面中包含隐藏的ID输入



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因