Solução para: Atualização de atualização, inserção ou exclusão da instrução afetou um número inesperado de linhas (0)

Eu encontrei uma solução para pessoas que recebem uma exceção:

A declaração de atualização, inserção ou exclusão da loja afetou um número inesperado de linhas (0). As entidades podem ter sido modificadas ou excluídas desde que as entidades foram carregadas. Atualize as inputs do ObjectStateManager.

Mas, de qualquer maneira eu tenho pergunta.

Eu li tópico: Entity Framework: “Atualização de loja, inserir ou excluir instrução afetou um número inesperado de linhas (0).” Para o VMAtm, Robert Harvey

No meu caso, eu tinha, por exemplo, artigos de tabela:

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

E eu tive gatilho:

 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 

Quando eu excluir este gatilho, então eu não recebo esta exceção. Então esse gatilho é problema. E agora eu tenho uma pergunta – por quê? Eu deveria fazer alguma coisa?

    Solução:

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

    É melhor você atualizar o seu método de salvar como este ….. No caso de você chamar o método savechange() do contexto da entidade após cada addobject e deleteobject ou modificação:

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

    É porque você tem SET NOCOUNT ON .
    A instrução SQL do EF que ela gera SEMPRE adiciona uma cláusula de where @@ROWCOUNT > 0 and [ID] = scope_identity() (por exemplo).
    Observe a cláusula where @@ROWCOUNT > 0 . Tire sua instrução SET NOCOUNT ON e isso deve funcionar.

    Possível problema: você colocou um ReadOnlyAttribute nos metadados da sua chave de entidade, o que faz com que seu valor se torne zero

      [DisplayName("Student ID")] [ReadOnly(true)] public int StudentID { get; set; } 

    Solução: remova o ReadOnlyAttribute

      [DisplayName("Student ID")] public int StudentID { get; set; } 

    Eu tive o mesmo problema, essa mensagem de erro é um pouco confusa. A resposta da webtrifusion me ajudou. Consulte Entity Framework: “Atualizar, inserir ou excluir instruções da loja afetou um número inesperado de linhas (0).”

    Acontece que eu esqueci de adicionar “Id: 0” no JSON no lado do cliente.

    Eu tinha InsertAsync configuração EntityState para Modificado implementando um padrão de repository . Quando a debugging eu vi o id da entidade era 0

      public async Task InsertAsync(T entity) { dbContext.Entry(entity).State = EntityState.Modified; await dbContext.SaveChangesAsync(); } 

    Alterar o Estado da Entidade para Adicionado corrigiu-o.

      dbContext.Entry(entity).State = EntityState.Added; 

    Eu encontrei este erro quando eu atualizando entidade e esqueci de passar o valor da chave primária ….

    Entidade pode atualizar registro com referência com chave primária

    Solução: verifique se o valor da chave primária é aprovado ou não para atualizar o registro fornecido. 🙂

    Eu tive o mesmo erro, então eu percebi que eu esqueci a chave primária definida na tabela e definindo valores de incremento …

    Usando o Entity Framework Code primeiro,

    usando (MyDbContext db = new MyDbContext ()) {..

    Adicionando isto depois da linha usando:

     db.Configuration.ValidateOnSaveEnabled = true;