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

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-21 14:38:08

3 月,跳不动了?>>>

关闭。 这个问题是 题外话 。 它当前不接受答案。

想改善这个问题吗? 更新问题 ,使其成为Stack Overflow 的主题

去年关闭。

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

存储更新,插入或删除语句影响了意外的行数(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();
                }
        }
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!