c# - Entity Framework 代码优先中的 DbUpdateConcurrencyException

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

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

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

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

最佳答案

我发现这个问题是 Entity Framework 4.0 中的一个已知错误,它从 2010 年开始出现,将在下一个版本中解决(希望在 4.5 中)。 当我更新具有相关对象的对象时,EF 会尝试更新所有关系,并且由于在 parentes 中没有任何更改,它会给我“0 行”消息。

希望对大家有帮助。

关于c# - Entity Framework 代码优先中的 DbUpdateConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838624/

相关文章:

c# - 取消嵌套列表迭代以提高性能

c# - 删除 XYZ 点列表中的重复项

c# - 从网络服务向服务器发送 POST

C# 路径操作

c# - 在 ASP.NET MVC 中,将身份验证模型移至类库

asp.net-mvc - 避免在业务层使用 SelectList (MVC 3)

entity-framework - Entity Framework 代码优先与 Guid

c# - ObjectSet<T>.AddObject() 与 EntityCollection<T>.Add()

c# - 我可以对以任何顺序唯一的多个属性设置主键/唯一约束吗?

wcf - EF 4.1 Code First - 使用新上下文/WCF 时未更新 FK 值的更改