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! 😉

Imagine monitoring actually built for developers

Billboard image

Join Vercel, CrowdStrike, and thousands of other teams that trust Checkly to streamline monitor creation and configuration with Monitoring as Code.

Start Monitoring

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

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay