Solution for: Store update, insert, or delete statement affected an unexpected number of rows (0)

102,138

Solution 1

Solution:

try {
    context.SaveChanges();
} catch (OptimisticConcurrencyException) {
    context.Refresh(RefreshMode.ClientWins, db.Articles);
    context.SaveChanges();
}

Solution 2

Its better you update your save method like this..... In case you calling savechange() method of entity context after every addobject and deleteobject or modification :

public void Save(object entity)
{
    using (var transaction = Connection.BeginTransaction())
    {
        try
        {
            SaveChanges();
            transaction.Commit();
         }
         catch (OptimisticConcurrencyException)
         {
             if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                    this.Refresh(RefreshMode.StoreWins, entity);
              else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                    Detach(entity);
              AcceptAllChanges(); 
              transaction.Commit();
          }

    }
}

Solution 3

It's because you have SET NOCOUNT ON.
The EF SQL Statement that it generates ALWAYS adds a clause of where @@ROWCOUNT > 0 and [ID] = scope_identity() (for example).
Notice the where @@ROWCOUNT > 0 clause. Take off your SET NOCOUNT ON statement and it should work.

Solution 4

In my case, need to set DatabaseGenerated Attribute when Custom Code First Conventions

public class Car
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Model { get; set; }
    public DateTime Registered { get; set; }
}

or

Switching off Identity for Numeric Primary Keys The following example sets the DepartmentID property to System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None to indicate that the value will not be generated by the database.

modelBuilder.Entity<Department>().Property(t => t.DepartmentID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

see https://docs.microsoft.com/zh-tw/ef/ef6/modeling/code-first/conventions/custom

and https://www.learnentityframeworkcore.com/configuration/data-annotation-attributes/databasegenerated-attribute

and https://docs.microsoft.com/zh-tw/ef/ef6/modeling/code-first/fluent/types-and-properties

Solution 5

I had the same problem, this error message is a rather mystifying one. The answer from webtrifusion helped me. See Entity Framework: "Store update, insert, or delete statement affected an unexpected number of rows (0)."

It turns out I forgot to add "Id:0" in the JSON on the client side.

Share:
102,138
nosbor
Author by

nosbor

I am

Updated on June 21, 2020

Comments

  • nosbor
    nosbor almost 4 years

    I found a solution for people who get an exception:

    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.

    But, anyway I have question.

    I read topic: Entity Framework: "Store update, insert, or delete statement affected an unexpected number of rows (0)." To VMAtm, Robert Harvey

    In my case I had for example table articles:

    Articles
    ------------
    article_id
    title
    date_cr
    date_mod
    deleted
    

    And I had trigger:

    create trigger articles_instead_of_insert 
    on articles instead of insert 
    as      
        SET NOCOUNT ON;
        insert into articles(
            article_id, 
            title, 
            date_cr,
            date_mod, 
            deleted
        )
        select 
            user_id, 
            title, 
            isnull(date_cr, {fn NOW()}),
            isnull(date_mod, {fn NOW()}),
            isnull(deleted, 0)
        from inserted;
    go
    

    When I delete this trigger then I dont get this exception. So this trigger is problem. And now I have a question - Why? Should I do something?