【问题标题】:DbUpdateConcurrencyException in Entity Framework Code First实体框架代码中的 DbUpdateConcurrencyException
【发布时间】:2012-05-31 17:47:04
【问题描述】:

我在使用 Entity Framework 和 Code First 时遇到问题。 我有一个带有 Timestamp 属性的实体,我在数据库中添加了一条新记录,调用 SaveChanges,一切正常。 当我尝试删除刚刚添加的记录时,我收到以下消息:

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

在我看来,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

【问题讨论】:

  • 当异常发生并且我调用 concurrencyException.Entries.Single().Reload();它有效,但我不希望每次保存或删除记录时都抛出异常。
  • 你在使用线程吗? (例如,ASP.Net)
  • 不,它是一个单线程应用程序。我不知道这是否重要,但我的上下文是静态的。
  • 尝试将 ProxyCreationEnabled 设置为 false。这对我有帮助,但这是一种解决方法而不是解决方案。

标签: c# entity-framework-4 ef-code-first


【解决方案1】:

我发现该问题是 Entity Framework 4.0 中的一个已知错误,它自 2010 年以来就存在,并将在下一个版本中解决(希望在 4.5 中)。 当我更新具有相关对象的对象时,EF 会尝试更新所有关系,并且由于父级中没有任何变化,它会给我“0 行”消息。

希望对某人有所帮助。

【讨论】:

    【解决方案2】:

    我建议,使用 Context 的本地范围:

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

    【讨论】:

    • 没有解决核心问题。问题是在带有修改客户端的服务器上进行的潜在编辑。谁赢了?
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 2011-06-28
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多