DEV Community

Gabriel Batista
Gabriel Batista

Posted on

Como Resolver o Erro DbUpdateConcurrencyException no Entity Framework

Se você estiver gerando seus próprios IDs ao usar Entity Framework e se deparar com um erro de concorrência, essa dica pode te ajudar!

Recentemente, enfrentei um problema interessante ao trabalhar com Entity Framework: um DbUpdateConcurrencyException aparentemente inexplicável ao tentar salvar novas entidades.

A funcionalidade era simples:

  • Recuperar um Grupo do banco
  • Adicionar um Membro ao Grupo
  • Salvar tudo

O código parecia correto, mas sempre recebia:

DbUpdateConcurrencyException: The database operation was expected to affect 1 row(s), but actually affected 0 row(s)
Enter fullscreen mode Exit fullscreen mode

O que acontece?

Esse erro ocorre porque, por padrão, o Entity Framework assume a responsabilidade de gerar e gerenciar os valores das chaves primárias das entidades. Quando você define manualmente um valor para uma chave que normalmente seria gerada, a entidade será rastreada como "Modified" em vez de "Added" e quando uma entidade é marcada como "Modified" em vez de "Added", o EF tenta fazer um UPDATE no banco em vez de um INSERT mas não existe registro para atualizar (é uma nova entidade)

Esse erro ocorre porque, por padrão, o Entity Framework assume a responsabilidade de gerar e gerenciar os valores das chaves primárias das entidades. Quando você define manualmente um valor para uma chave que normalmente seria gerada, a entidade é rastreada como "Modified" em vez de "Added". Como resultado, o EF tenta realizar um UPDATE no banco de dados em vez de um INSERT, mas não existe nenhum registro para atualizar (é uma nova entidade).

A solução? Configure explicitamente que a chave primária não deve ser gerada automaticamente. Isso pode ser feito no Fluent API:

builder.Property(t => t.Id).ValueGeneratedNever();

Enter fullscreen mode Exit fullscreen mode

Ou com data annotations:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Id { get; set; }
Enter fullscreen mode Exit fullscreen mode

Espero que essa dica ajude você a evitar horas de debugging! 😉

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay