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

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

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

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


当前回答

这件事刚刚发生在我身上。我正在运行Aurora (AWS MySQL),并试图将记录添加到表中。在模型中标记为[Key]的字段被映射到表中的一个自动递增字段…至少我是这么想的。它被设置为主键,但没有设置为自动递增。所以将它设置为自动递增解决了我的问题。

其他回答

如果您试图在edmx文件中创建到“function Imports”的映射,则可能会导致此错误。只要清除位于edmx中给定实体的映射细节中的插入、更新和删除字段,它就应该工作了。 我希望我讲清楚了。

我也有同样的问题。 在我的情况下,我试图更新主键,这是不允许的。

最近,我正在尝试将EF5升级为EF6样本项目。示例项目的表格有十进制(5,2)类型的列。数据库迁移成功完成。但是,初始数据种子产生了异常。

模型:

    public partial class Weather
    {
    ...
    public decimal TMax {get;set;}
    public decimal TMin {get;set;}
    ...
    }

配置错误:

public partial class WeatherMap : EntityTypeConfiguration<Weather>
{

    public WeatherMap()
    {
        ...
        this.Property(t => t.TMax).HasColumnName("TMax");
        this.Property(t => t.TMin).HasColumnName("TMin");
        ...
    }
}

数据:

    internal static Weather[] data = new Weather[365]
    {
      new Weather() {...,TMax = 3.30M,TMin = -12.00M,...},
      new Weather() {...,TMax = 5.20M,TMin = -10.00M,...},
      new Weather() {...,TMax = 3.20M,TMin = -8.00M,...},
      new Weather() {...,TMax = 11.00M,TMin = -7.00M,...},
      new Weather() {...,TMax = 9.00M,TMin = 0.00M,...},
    };

我发现了问题,播种数据有精度值,但配置没有精度和比例参数。在样本表中用十进制(10,0)定义的TMax和TMin字段。

正确配置:

public partial class WeatherMap : EntityTypeConfiguration<Weather>
{

    public WeatherMap()
    {
        ...
        this.Property(t => t.TMax).HasPrecision(5,2).HasColumnName("TMax");
        this.Property(t => t.TMin).HasPrecision(5,2).HasColumnName("TMin");
        ...
    }
}

我的示例项目运行在:MySql 5.6.14, Devart.Data。MySql, MVC4, .Net 4.5.1, EF6.01

致以最亲切的问候。

行[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]在我的例子中发挥了作用:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;


[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? SomeNumber { get; set; }

哇,很多答案,但我得到这个错误时,我做了一些稍微不同,没有人提到。

长话短说,如果您创建了一个新对象,并告诉EF它使用EntityState进行了修改。修改后,它将抛出这个错误,因为它还不存在于数据库中。这是我的代码:

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

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

是的,这看起来很愚蠢,但它的出现是因为有问题的方法以前已经创建了foo,现在它只传递了someValue给它,并创建了foo自己。

很容易修复,只需改变EntityState。修改为EntityState。添加或更改整行为:

context.MyObject.Add(foo);