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.
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%.
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
Parabéns … muito útil e esclarecedor!
Olá Fúlvio,
Obrigado pela contribuição! 🙂
[]s!
Entity Framework é show de bola e sempre bom ver tutoriais e conhecimentos adicionais…
Olá Fúlvio!
Sim, com certeza! O EF tem mtos recursos! Não podemos apenas ficar satisfeitos com o CRUD básico 🙂
[]s!
Obrigado por postar!
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!
[…] Mais dados sobre este assunto podem ser encontrados neste outro post: Entity Framework – Desabilitando o tracking de entidades […]
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.
Olá Alexandre. Obrigado pelo feedback. É bom saber que agora está melhor.
Obrigado.
[]s!
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?
Que tal dar créditos de onde “chupou” as informações?
http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking
Amigo, acredito que vc não leu o texto corretamente. Eu faço a citação “Com base nos experimentos de Luke McGregor (http://blog.staticvoid.co.nz/2012/04/entity-framework-and-asnotracking.html)”.