我正在使用实体框架填充网格控件。 有时,当我进行更新时,会出现以下错误:
存储更新,插入或删除语句影响了意外的行数(0)。 自加载实体以来,实体可能已被修改或删除。 刷新ObjectStateManager条目。
我不知道如何重现这一点。 但这可能与我进行更新的紧密程度有关。 是否有人看到过此消息,或者有人知道错误消息指的是什么?
编辑:不幸的是,我不再自由重现我在这里遇到的问题,因为我退出了这个项目,不记得我是否最终找到了解决方案,是否有其他开发人员修复了它,或者我是否在解决它。 因此,我不能接受任何答案。
#1楼
我当时面临着同样的令人恐惧的错误... :)然后我意识到我忘记了设置一个
@Html.HiddenFor(model => model.UserProfile.UserId)
用于更新对象的主键! 我倾向于忘记这个简单但非常重要的事情!
顺便说一句: HiddenFor
适用于ASP.NET MVC。
#2楼
当我删除数据库中的某些行(在循环中)并在同一表中添加新行时,出现了该错误。
对我来说,解决方案是在每次循环迭代中动态创建新上下文
#3楼
哇,有很多答案,但是当我做了一些与众不同的事情时,却遇到了这个错误。
长话短说,如果您创建一个新对象并告诉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);
#4楼
编辑时,将实体的ID或主键作为视图中的隐藏字段
即
@Html.HiddenFor(m => m.Id)
解决了这个问题。
另外,如果您的模型包括未使用的项目,也将其包括在内,并将其发布到控制器
#5楼
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();
}
}
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3207736