【问题标题】:Entity Framework: Store update, insert, or delete statement affected an unexpected number of rows (0)实体框架:存储更新、插入或删除语句影响了意外的行数 (0)
【发布时间】:2018-03-30 14:16:44
【问题描述】:

在我继续之前,我已经阅读了所有同名主题,但无法解决我的问题,所以我不得不再次询问。

我有这样的模型:

class a {
    int id;
    class b b;
    list of class c c;
    string status 
}
class b {
    int id; //some other stuff
}
class c {
    int id; //some other stuff
}

所以我想做的是从数据库中加载 a 类的对象(按 id (pk) 过滤) 然后更新字符串状态(保持相关实体不变) 并保存到数据库。 更改 a 类的一些字符串字段后 并调用 context.savechanges() 结果我得到的是(a类)数据库中的重复行,具有正确的值但不同的ID。 所以我想我需要告诉 ef 条目的状态已更改为“EntityState.Modified” 这样做后,我的问题标题出现异常。

这很重要我在尝试保存之前检查了 c 类的调试模式实例确实具有主键值,并且 db 确实具有具有相同 pk 值的行,所以我没有尝试更新不存在的行

context.orders.Add(current);
                context.Entry(current).State = EntityState.Modified;
                context.SaveChanges();

此代码在标题中引发异常 对象“当前”在保存之前有它的 pk 值

任何帮助将不胜感激

【问题讨论】:

  • 我很确定您不需要Add 的第一行,实际上无法添加它,因为它已经有一个主键。您只需将其标记为已修改,然后保存更改。
  • 我刚刚测试过了,你是对的。我现在为自己感到羞耻,多么简单的错误。无论如何谢谢你好先生
  • 我无法将您的评论标记为答案,所以如果您将其发布为答案,我会标记它(再次感谢)
  • @giorgi 你确定这个实体是附加的吗?是否启用了公共和虚拟属性或更改跟踪?当您的实体未附加或您忽略主键时,这很常见。
  • 在这种情况下,加载/更新是由相同的上下文完成的,因此它知道对象的状态

标签: c# entity-framework


【解决方案1】:

该实体已存在于数据库中,因此您无需调用Add。这就是导致它失败的原因 - 它已经存在,因此不能再次插入(这会破坏主键约束)。只需将其标记为已修改并保存更改,就足以在数据库中更新它:

context.Entry(current).State = EntityState.Modified;
context.SaveChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多