Você usa AsNoTracking() nas suas consultas com Entity Framework?

O Entity Framework é um framework de mapeamento objeto-relacional amplamente utilizado para acessar e manipular dados em aplicativos .NET. Ele fornece um conjunto poderoso de recursos para consultas de banco de dados, mas nem sempre consideramos a importância de usar métodos como o AsNoTracking(). Neste post, vamos explorar por que o uso do AsNoTracking() é crucial em consultas do Entity Framework, e também apresentar um exemplo que ilustra os benefícios de desabilitar o rastreamento de entidades.

O que é o AsNoTracking()?

O método AsNoTracking() é uma funcionalidade do Entity Framework que permite desabilitar o rastreamento de entidades retornadas em uma consulta. Quando o rastreamento de entidades está ativado, o Entity Framework mantém o controle do estado de cada entidade retornada por uma consulta, a fim de permitir a atualização e persistência de alterações no banco de dados. No entanto, em certos casos, não precisamos desse recurso, e é aí que o AsNoTracking() se torna útil.

Benefícios do uso do AsNoTracking()

  1. Performance aprimorada

    Ao desabilitar o rastreamento de entidades, evitamos o custo adicional de manter o controle de seu estado durante toda a vida útil do contexto. Isso resulta em consultas mais eficientes e rápidas, uma vez que não há necessidade de acompanhar as alterações feitas nas entidades.

  2. Redução do consumo de memória

    Com o rastreamento de entidades desabilitado, o Entity Framework não precisa armazenar entidades retornadas em cache para rastrear suas alterações. Isso ajuda a reduzir o consumo de memória, especialmente quando há grandes volumes de dados envolvidos.

  3. Evitar problemas de concorrência

    O rastreamento de entidades pode levar a problemas de concorrência, especialmente em cenários de alto tráfego ou com múltiplas threads acessando o mesmo contexto. Ao usar o AsNoTracking(), garantimos que as entidades não estão associadas ao contexto e, portanto, não causarão problemas de concorrência ao serem manipuladas por diferentes threads.

Exemplo de comparação de performance e concorrência

Vamos considerar um exemplo em que temos uma aplicação ASP.NET que exibe uma lista de produtos. Usaremos o Entity Framework para recuperar os dados do banco de dados.

Consulta com rastreamento:

C#
using (var context = new MeuContexto())
{
    var produtos = context.Produtos.ToList();
}

Consulta sem rastreamento:

C#
using (var context = new MeuContexto())
{
    var produtos = context.Produtos.AsNoTracking().ToList();
}

Resultado

Plaintext
BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.3086/22H2/2022Update)
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET SDK=7.0.203
  [Host]     : .NET 6.0.18 (6.0.1823.26907), X64 RyuJIT AVX2
  DefaultJob : .NET 6.0.18 (6.0.1823.26907), X64 RyuJIT AVX2


|                  Method |     Mean |    Error |   StdDev |      Gen0 |     Gen1 |     Gen2 | Allocated |
|------------------------ |---------:|---------:|---------:|----------:|---------:|---------:|----------:|
| ConsultaComRastreamento | 48.25 ms | 0.935 ms | 2.397 ms | 1888.8889 | 777.7778 | 222.2222 |  11.64 MB |
| ConsultaSemRastreamento | 22.84 ms | 0.444 ms | 0.801 ms |  593.7500 | 218.7500 |  31.2500 |   3.59 MB |

REDUÇÃO DE 52% NO TEMPO DE EXECUÇÂO

REDUÇÃO DE 69% NO USO DE MEMÓRIA

Ao executar essas duas consultas, notaremos que a versão com AsNoTracking() é significativamente mais rápida, especialmente quando há muitos registros de produtos. Além disso, se a aplicação tiver vários usuários acessando a lista de produtos ao mesmo tempo, o uso do AsNoTracking() garantirá que não haja problemas de concorrência relacionados à atualização ou exclusão de entidades.

O uso do método AsNoTracking() em consultas usando o Entity Framework é uma prática importante para melhorar a performance e evitar problemas de concorrência em nossas aplicações. Ao desabilitar o rastreamento de entidades, obtemos consultas mais eficientes, reduzimos o consumo de memória e evitamos conflitos de concorrência. Portanto, sempre que possível, devemos considerar a utilização do AsNoTracking() para otimizar nossas consultas no Entity Framework.

Código Fonte:

Icons made by Freepik from www.flaticon.com'
Compartilhe:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima