猿问

实体框架:“存储UPDATE、INSERT或DELETE语句影响到意外的行数(0)”。

实体框架:“存储UPDATE、INSERT或DELETE语句影响到意外的行数(0)”。

我使用实体框架填充网格控件。有时,当我进行更新时,会出现以下错误:

存储UPDATE、INSERT或DELETE语句影响到意外的行数(0)。自加载实体以来,实体可能已被修改或删除。刷新ObjectStateManager条目。

我不知道怎么复制这个。但这可能与我更新的距离有多近有关。有没有人看到这个,或者有人知道错误信息指的是什么?

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


UYOU
浏览 950回答 3
3回答

繁花不似锦

这是一个叫做乐观并发的特性的副作用。不能100%确定如何在实体框架中打开/关闭它,但它所告诉您的基本上是,当您从数据库中抓取数据时,当您保存更改时,其他人更改了数据(这意味着,当您保存数据时,实际更新了0行数据)。在SQL术语中,它们的update查询的where子句包含行中每个字段的原始值,如果0行受到影响,它就知道出了问题。背后的想法是,您不会最终覆盖应用程序不知道已经发生的更改-这基本上是.NET在您的所有更新中加入的一种安全措施。如果它是一致的,则可能发生在您自己的逻辑中(EG:您实际上是在另一个方法中更新数据-在SELECT和UPDATE之间),但它可能只是两个应用程序之间的一个竞争条件。

互换的青春

我遇到了这种情况,这是由于实体的ID(Key)字段未被设置所致。因此,当上下文保存数据时,它无法找到ID=0。确保在UPDATE语句中放置一个断点,并验证实体的ID是否已设置。来自Paul Bellora的评论我遇到了这个问题,原因是我忘记在.cshtml编辑页面中包含隐藏的ID输入。

墨色风雨

哇,很多答案,但是当我做了一些其他人没有提到的稍微不同的事情时,我得到了这个错误。长话短说,如果您创建一个新对象并告诉EF使用EntityState.Modified然后它会抛出这个错误,因为它还不存在于数据库中。这是我的代码:MyObject foo = new MyObject(){     someAttribute = someValue};context.Entry(foo).State = EntityState.Modified;context.SaveChanges();是的,这似乎很愚蠢,但它的出现是因为所讨论的方法过去foo传递给它之前创建的,现在它只具有someValue传递给它并创建foo本身。简单的修复,只要改变EntityState.Modified到EntityState.Added或将整条线改为:context.MyObject.Add(foo);
随时随地看视频慕课网APP
我要回答