Entity Framework – Desabilitando o tracking de entidades

Existem cenários nos quais temos de executar consultas sem que as entidades sejam controladas pelo tracking do Entity Framework.

Este cenário é comum quando executamos consultas que retornam uma quantidade grande de registros para leitura dos dados sem que a sua edição seja necessária, como exemplo a composição de um grid ou o retorno de um serviço. Para estas abordagens é apenas necessária a apresentação dos dados, executando da forma mais rápida possível e com o menor consumo de recursos possível, sem que o Entity Framework acompanhe os estados das instâncias construídas.

Para atender essa necessidade, de não acompanhar o estados dos objetos, deve-se ser utilizado um extension method chamado “AsNoTracking”. Este extension method permite que a consulta retorne dados que não terão seus respectivos estados acompanhados pelo Entity Framework.

Exemplo de código com AsNoTracking()

Este extension method funciona para os modelos criados pelo Entity Framework Code-First, Model-First ou DataBase-First.

Eu recomendo o uso deste extension method, pois o ganho de performance é muito relevante.

Com base nos experimentos de Luke McGregor (http://blog.staticvoid.co.nz/2012/04/entity-framework-and-asnotracking.html) os ganhos em memória e tempo de execução são bastante relevantes. De acordo com seus testes, o ganho em tempo de execução é de 19%, ao mesmo tempo que o ganho em uso de memória é de 66%.

Gráfico de tempo de execução

Gráfico de uso de memória

Lembrando que estes experimentos foram utilizados com o Entity Framework 5 e .Net Framework 4.5.

Quando não devemos usar o AsNoTracking? Quando queremos aproveitar as entidades retornadas por nossa consulta para realização de atualizações na base de dados.

Espero que este post seja útil.

Por
Msc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Data Platform Development

Referências:
http://blogs.msdn.com/b/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
http://www.shujaat.net/2012/03/entity-framework-code-first-change.html
http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx
http://msdn.microsoft.com/en-us/data/jj556203.aspx

Anúncios

12 Responses to Entity Framework – Desabilitando o tracking de entidades

  1. Fúlvio Cezar Canducci Dias says:

    Parabéns … muito útil e esclarecedor!

  2. Felipe Augusto says:

    Olá Fernando obrigado pela resposta, me ajudou em um cenario onde eu tenho eu tenho algumas entidades que são criadas em um dbcontext (somente para seleção delas) e que em seguida atribuo elas a uma outra entidade n:n e salvo no banco de dados, sem o uso do AsNoTracking eu estava recebendo a Ex “Um objeto de entidade não pode ser referenciado por várias instâncias de IEntityChangeTracker.”. Mas com ele consegui fazer a operação.

    Mas minha duvida é a seguinte, como eu crio duas instancias de dbcontext e teoricamente a primeira foi apagada, como o tracker sabe que a entidade ainda está la e lança essa EX? ela ainda esta na primeira instancia mesmo? tem algum risco de usar o AsNoTracking para selecionar uma entidade e depois usa-la em outra instancia de DbContext para inserir uma nova entidade (relacionada com ela) no banco?

    Desde já agradeço!

    • Olá Felipe,
      Tudo beleza?

      A menos que a instância do se primeiro DbContext ainda esteja ativa (não tenha feito o Dispose ainda), a instância das suas entidades ainda estarão associadas a ela.

      Teoricamente, após feito o dispose da primeira instância do Dbcontext, as demais entidades deveriam estar livres… A menos q tenha ocorrido alguma falha no dispose do seu contexto e algo sobrou na memória…
      O risco disso acontecer deveria ser zero…

      Teve algum cenário que vc viu isso acontecer?

      []s!

  3. Pingback: Entity Framework – Melhores práticas em busca de performance | Fernando Henrique Ferreira

  4. Alexandre says:

    Olá Fernando !

    Acabei de fazer um teste aqui em uma grid que mostrava 7.000 registros.

    Colocando o AsNoTracking() o consumo de memória caiu para mais de 50% só nessa consulta.

    Muito bom mesmo. Obrigado.

  5. Ola, estamos usando repositorio generico, e na hora de atualizar a entity, um erro de attaching é detectado(http://stackoverflow.com/questions/23201907/asp-net-mvc-attaching-an-entity-of-type-modelname-failed-because-another-ent). Diante de algumas pesquisas, resolvemos desabilitar o tracking e so depois dar o attach. Existe outro caminho?

  6. Caverna says:

    Que tal dar créditos de onde “chupou” as informações?
    http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: