Desvendando o Identity Resolution: Potencialize sua Experiência com o Entity Framework

Antônio Silva
5 min readJun 29, 2023

--

Olá a todos! Hoje vou apresentar o conceito de Resolução de Identidade no Entity Framework (EF). Se você já teve experiência com o EF, é provável que já tenha encontrado essa funcionalidade, mas talvez não esteja familiarizado com seu significado ou funcionamento. Vamos explorar isso juntos!

O que é Identity Resolution?

Identity Resolution é o processo pelo qual o EF garante que cada entidade (objeto que representa uma linha de uma tabela do banco de dados) seja carregada apenas uma vez na memória, mesmo que ela seja referenciada por várias outras entidades. Isso evita duplicação de dados e inconsistências na aplicação.

Por exemplo, imagine que você tenha as seguintes classes:

Cliente.cs
Pedido.cs

E que você tenha os seguintes dados no banco:

dbCliente
dbPedido

Agora, imagine que você queira carregar todos os pedidos e seus respectivos clientes usando o EF. Você poderia fazer algo assim:

Lista todos os pedidos

O que acontece nesse caso é que o EF vai executar uma consulta SQL que vai retornar os seguintes dados:

Todos os pedidos com a informação do cliente

Note que o cliente João aparece duas vezes na consulta, pois ele tem dois pedidos. No entanto, o EF não vai criar dois objetos Cliente com o mesmo Id na memória. Ele vai usar o Identity Resolution para garantir que haja apenas um objeto Cliente com o Id = 1, e que ele seja referenciado pelos dois objetos Pedido que ele possui. O mesmo vale para a Maria, que tem um objeto Cliente com o Id = 2, referenciado pelo seu único objeto Pedido.

Isso significa que se você fizer algo como:

Pedido na posição 0, alterando o nome do cliente

Você vai alterar o nome do cliente tanto no primeiro quanto no segundo pedido, pois eles apontam para o mesmo objeto Cliente na memória. Isso mantém a consistência dos dados e evita surpresas indesejadas.

Como o EF faz isso?

O EF usa um recurso chamado ObjectStateManager para gerenciar o estado das entidades na memória. O ObjectStateManager mantém um dicionário interno que mapeia cada entidade a uma chave única, composta pelo tipo da entidade e pelo seu Id. Assim, sempre que o EF precisa carregar uma entidade na memória, ele verifica se ela já existe no ObjectStateManager usando essa chave. Se ela já existe, ele retorna a mesma instância. Se ela não existe, ele cria uma nova instância e a adiciona ao ObjectStateManager.

Isso acontece tanto para consultas quanto para atualizações. Por exemplo, se você fizer algo como:

Adiciona uma nova referencia ao objeto existente

O EF vai verificar se já existe um objeto Cliente com o Id = 1 no ObjectStateManager. Se existir, ele vai ignorar o objeto cliente que você passou e vai usar o objeto existente. Se não existir, ele vai adicionar o objeto cliente ao ObjectStateManager e vai marcá-lo como Unchanged (não modificado).

Isso também vale para entidades relacionadas. Por exemplo, se você fizer algo como:

O EF vai verificar se já existe um objeto Pedido com o Id = 1 e um objeto Cliente com o Id = 1 no ObjectStateManager. Se existirem, ele vai ignorar os objetos que você passou e vai usar os objetos existentes. Se não existirem, ele vai adicionar os objetos ao ObjectStateManager e vai marcá-los como Unchanged.

Quais são as vantagens e desvantagens do Identity Resolution?

A principal vantagem do Identity Resolution é que ele garante a consistência dos dados na memória, evitando duplicação e inconsistência. Isso facilita o trabalho com entidades relacionadas e evita problemas de concorrência e de performance.

A principal desvantagem do Identity Resolution é que ele pode causar confusão se você não entender como ele funciona ou se você tentar usar objetos diferentes com o mesmo Id na mesma instância do contexto. Isso pode levar a comportamentos inesperados e a erros difíceis de depurar.

Como evitar problemas com o Identity Resolution?

Para evitar problemas com o Identity Resolution, você deve seguir algumas boas práticas:

  • Entenda como o EF funciona e como ele gerencia as entidades na memória.
  • Use sempre a mesma instância do contexto para trabalhar com as mesmas entidades.
  • Não crie objetos diferentes com o mesmo Id na mesma instância do contexto.
  • Não modifique as propriedades-chave das entidades depois de carregá-las ou anexá-las ao contexto.
  • Não misture objetos carregados pelo EF com objetos criados manualmente sem usar o Attach ou o Update.
  • Use o AsNoTracking para carregar entidades que você não pretende modificar ou relacionar com outras entidades.

Conclusão

Espero que você tenha entendido como ele funciona e como ele pode ajudar a manter a consistência dos dados na memória. Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo. Até a próxima!

https://learn.microsoft.com/en-us/dotnet/api/system.data.objects.objectstatemanager?view=netframework-4.8.1

--

--

Antônio Silva
Antônio Silva

Written by Antônio Silva

Sou Analista Desenvolvedor Especialista 👨‍💻; Sou um grande apaixonado na programação mobile e um grande sonhador com o futuro progressivo das PWA;

No responses yet