6

I'm having a issue with Entity Framework and Code First. I have an entity with a Timestamp property, and I add an new record to the database, call SaveChanges, and it's all ok. When I try to delete the record I've just added, I get the following message:

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.

It seems to me that EF has no knowledge that this new record exists in database, despite the fact that it is there. Sometimes, even when I try to update an different record I get the same message, but if I try to delete an different one it works.

Does anyone knows why this is happening?

Thanks in advance, Diego

EDIT I've assembled some code to make it easier to understand my problem:

I have two simple entities:

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; }
}

The Context:

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; }
}

And the code:

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
4
  • When the exceptions occurs and I call concurrencyException.Entries.Single().Reload(); it works, but I don't want an Exception to be thrown every time I save or delete a record. Commented May 31, 2012 at 17:55
  • Are you using threads at all? (eg, ASP.Net) Commented May 31, 2012 at 17:57
  • No, it's a single thread application. I don't know if it's important, but my Context is static. Commented May 31, 2012 at 17:59
  • Try setting ProxyCreationEnabled to false. That helped me, but it's a workaround not a solution. Commented Jun 4, 2012 at 7:49

2 Answers 2

4

I've found out that the problem is a known bug in Entity Framework 4.0, and that it's presente since 2010 and will be resolved in the next version (hope in 4.5). When I update an object that has related objects, EF tries to update all the relations, and as nothing has changed in the parentes, it will give me the '0 rows' message.

Hope it helps someone.

Sign up to request clarification or add additional context in comments.

Comments

1

I suggest, using local scope for Context:

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

1 Comment

Doesn't solve the core problem. The issue is a potential edit on the server with a modification client side. Who wins?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.