我正在使用实体框架来填充网格控件。有时当我进行更新时,我得到以下错误:

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

我不知道怎么复制这个。但这可能和我更新的时间间隔有关系。有人见过这个吗,或者有人知道错误消息指的是什么吗?

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


当前回答

我今天遇到了一个类似的问题,我将在这里记录它,因为它不完全是乐观并发错误。

我正在将一个旧系统转换为一个新的数据库,它有几千个实体,我必须把它们脚本转移到新系统。然而,为了帮助理智,我选择保持原始的唯一id,所以是注入到新对象,然后尝试保存它。

我遇到的问题是,我使用MVC脚手架来创建基本存储库,他们在他们的UpdateOrInsert方法中有一个模式,基本上是在添加新实体或将其状态更改为modified之前检查是否设置了Key属性。

因为设置了Guid,所以它试图修改数据库中实际上不存在的行。

我希望这能帮助到其他人!

其他回答

在同一个上下文中使用SaveChanges(false)和后来的SaveChanges()时得到此错误,在一个工作单元中,从两个表中删除多行(在上下文中)(SaveChanges(false)在其中一个删除中。然后在调用函数中,SaveChanges()被调用为....解决方案是删除不必要的SaveChanges(false)。

我遇到这种情况是因为datetime和datetime2之间不匹配。奇怪的是,在测试人员发现问题之前,它工作得很好。我的Code First模型包括一个DateTime作为主键的一部分:

[Key, Column(Order = 2)]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

生成的列是一个datetime列。当调用SaveChanges时,EF生成了以下SQL:

-- Region Parameters
DECLARE @0 Int = 2
DECLARE @1 Int = 25
DECLARE @2 Int = 141051
DECLARE @3 DateTime2 = '2017-07-27 15:16:09.2630000' --(will not equal a datetime value)
-- EndRegion
UPDATE [dbo].[OrganizationSurvey]
SET [OrganizationSurveyStatusId] = @0
WHERE ((([SurveyID] = @1) AND ([OrganizationID] = @2)) AND ([PurchasedDate] = @3))

因为它试图将datetime列与datetime2值匹配,所以没有返回任何结果。我能想到的唯一解决方案是将列更改为datetime2:

[Key, Column(Order = 2, TypeName = "DateTime2")]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

在编辑时,将实体的id或主键作为视图中的隐藏字段

ie

      @Html.HiddenFor(m => m.Id)

这样问题就解决了。

此外,如果你的模型包括未使用的项目,也包括它,并张贴到控制器

我今天遇到了一个类似的问题,我将在这里记录它,因为它不完全是乐观并发错误。

我正在将一个旧系统转换为一个新的数据库,它有几千个实体,我必须把它们脚本转移到新系统。然而,为了帮助理智,我选择保持原始的唯一id,所以是注入到新对象,然后尝试保存它。

我遇到的问题是,我使用MVC脚手架来创建基本存储库,他们在他们的UpdateOrInsert方法中有一个模式,基本上是在添加新实体或将其状态更改为modified之前检查是否设置了Key属性。

因为设置了Guid,所以它试图修改数据库中实际上不存在的行。

我希望这能帮助到其他人!

  @Html.HiddenFor(model => model.RowVersion)

我的rowversion是null,所以必须将它添加到视图中 这解决了我的问题