DbUpdateConcurrencyException in Entity Framework Code First

本文关键字:Code First Framework Entity in DbUpdateConcurrencyException | 更新日期: 2023-09-27 18:35:50

我在实体框架和代码优先方面遇到了问题。我有一个具有 Timestamp 属性的实体,我向数据库添加了一条新记录,调用 SaveChanges,一切正常。当我尝试删除刚刚添加的记录时,我收到以下消息:

存储更新、插入或删除语句受意外影响 行数 (0)。此后,实体可能已被修改或删除 实体已加载。刷新对象状态管理器条目。

在我看来,EF 不知道这个新记录存在于数据库中,尽管它在那里。有时,即使我尝试更新不同的记录,我也会收到相同的消息,但是如果我尝试删除不同的记录,它也会起作用。

有谁知道为什么会这样?

提前感谢,迭 戈

编辑我已经组装了一些代码,以便更容易理解我的问题:

我有两个简单的实体:

public class Entidade1
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Descricao { get; set; }
    [Timestamp]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte[] RecTS { get; set; }
}
public class Entidade2
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Descricao { get; set; }
    [Timestamp]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte[] RecTS { get; set; }
    public virtual Entidade1 Entidade1 { get; set; }
}

背景:

public class DB : DbContext
{
    public DB() : base("DB")
    {
        this.Configuration.AutoDetectChangesEnabled = true;
        this.Configuration.LazyLoadingEnabled = true;
        this.Configuration.ProxyCreationEnabled = true;
    }
    public DbSet<Entidade1> Entidade1 { get; set; }
    public DbSet<Entidade2> Entidade2 { get; set; }
}

和代码:

var item = new Entidade1();

        item.Descricao = "teste";
        var db = new DB();
        db.Set(typeof(Entidade1)).Add(item);
        db.SaveChanges();
        var item2 = new Entidade2();
        item2.Descricao = "teste 2";
        item2.Entidade1 = item;
        db.Set(typeof (Entidade2)).Add(item2);
        db.SaveChanges();
        var q = (from c in db.Entidade1
                 where c.Descricao == "teste"
                 select c).FirstOrDefault();
        db.Set(typeof(Entidade1)).Remove(q);
        db.SaveChanges();
        var q2 = (from c in db.Entidade2
                  where c.Descricao == "teste 2"
                  select c).FirstOrDefault();
        db.Set(typeof (Entidade2)).Remove(q2);
        db.SaveChanges(); // Here I got the error

DbUpdateConcurrencyException in Entity Framework Code First

我发现该问题是实体框架 4.0 中的一个已知错误,并且自 2010 年以来一直存在,并将在下一个版本中解决(希望在 4.5 中)。当我更新具有相关对象的对象时,EF 会尝试更新所有关系,并且由于父级中没有任何更改,它将为我提供"0 行"消息。

希望它对某人有所帮助。

我建议,使用上下文的本地范围:

Using(var x = new MyObjectContext){
      //
      //....
      x.SaveChanges(); 
     }