我正在使用实体框架来填充网格控件。有时当我进行更新时,我得到以下错误:
存储更新、插入或删除语句影响了意外的行数(0)。实体可能在加载实体后已被修改或删除。刷新ObjectStateManager条目。
我不知道怎么复制这个。但这可能和我更新的时间间隔有关系。有人见过这个吗,或者有人知道错误消息指的是什么吗?
编辑:不幸的是,我不再有自由重现我在这里遇到的问题,因为我离开了这个项目,不记得我最终是否找到了解决方案,是否有其他开发人员修复了它,或者是否我绕过了它。因此我不能接受任何回答。
我正在使用实体框架来填充网格控件。有时当我进行更新时,我得到以下错误:
存储更新、插入或删除语句影响了意外的行数(0)。实体可能在加载实体后已被修改或删除。刷新ObjectStateManager条目。
我不知道怎么复制这个。但这可能和我更新的时间间隔有关系。有人见过这个吗,或者有人知道错误消息指的是什么吗?
编辑:不幸的是,我不再有自由重现我在这里遇到的问题,因为我离开了这个项目,不记得我最终是否找到了解决方案,是否有其他开发人员修复了它,或者是否我绕过了它。因此我不能接受任何回答。
当前回答
我得到了这个异常,我设置id列为自动增量在我的数据库的表,然后它工作得很好
其他回答
在我们的例子中,这个错误是由于将实体标记为已修改,而它们的属性并没有“真正”改变。例如,当你将相同的值赋给一个属性时,上下文可能会将其视为更新,而数据库则不会。
基本上,我们运行了一个脚本,用来自其他属性的连接值重新填充一个属性。对于很多记录来说,这意味着没有变化,但它将它们标记为修改。DB返回不同数量的更新对象,这可能触发了该异常。
我们通过检查属性值并仅在不同的情况下分配新的值来解决这个问题。
以上的答案都没有完全涵盖我的情况和解决方案。
在MVC5控制器中抛出错误的代码:
if (ModelState.IsValid)
{
db.Entry(object).State = EntityState.Modified;
db.SaveChanges(); // line that threw exception
return RedirectToAction("Index");
}
当我从Edit视图保存对象时,我收到了这个异常。它抛出它的原因是,当我回去保存它时,我修改了构成对象主键的属性。因此,将其状态设置为Modified对EF没有任何意义——它是一个新条目,而不是先前保存的条目。
你可以通过以下两种方法来解决这个问题:A)修改save调用来添加对象;B)在edit时不要更改主键。B)。
我也有同样的问题,我发现这是由RowVersion为null引起的。 检查Id和RowVersion是否为空。
有关更多信息,请参阅本教程
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application
在编辑时,将实体的id或主键作为视图中的隐藏字段
ie
@Html.HiddenFor(m => m.Id)
这样问题就解决了。
此外,如果你的模型包括未使用的项目,也包括它,并张贴到控制器
public void Save(object entity)
{
using (var transaction = Connection.BeginTransaction())
{
try
{
SaveChanges();
transaction.Commit();
}
catch (OptimisticConcurrencyException)
{
if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
this.Refresh(RefreshMode.StoreWins, entity);
else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
Detach(entity);
AcceptAllChanges();
transaction.Commit();
}
}
}