Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais
Diferença de AsNoTracking e AutoDetectChanges no Entity Framework
Data:1/28/2013

Translate this page now :





Categories: .NET , Entity Framework

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :
1
Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon

Veja Também


 

Anteriormente publiquei dicas sobre o uso do AsNoTracking (http://www.bufaloinfo.com.br/dicas.aspx?cod=1106) e do AutoDetectChanges (http://www.bufaloinfo.com.br/dicas.aspx?cod=1115), ambos úteis para otimizações no entity framework.

Porém observei que existe uma certa confusão entre o uso dos dois. Quando usar um, quando usar outro. Então vejamos uma descrição um pouco melhor de como isso funciona.

Contexto e Entidades

Quando buscamos entidades da através do entity framework, este guarda as entidades no contexto, fazendo um processo que é chamado de tracking das entidades. É este tracking, o fato das entidades estarem no contexto, que permite posteriormente que possa ocorrer uma atualização destas entidades.

Porém o simples tracking não é suficiente para que uma atualização ocorra. No momento em que pedimos que atualizações sejam salvas, o entity framework irá consultar entre as entidades das quais está fazendo tracking quais encontram-se marcadas como alteradas e então sim, enviar as alterações para o servidor.

Portanto, para que uma gravação ocorra, além do tracking estar sendo realizado, é necessário que a entidade esteja marcada como alterada.

DetectChanges

O processo pelo qual mudanças são detectadas é simples : Ao carregarmos entidades, é criada uma cópia delas, um snapshot, em memória. O contexto possui um método chamado DetectChanges que compara as entidades que carregamos com o snapshot guardado em memória. Se forem diferentes, uma mudança ocorreu.

AutoDetectChanges

O AutoDetectChanges significa detectar automaticamente a ocorrência de mudanças. Isso significa que, de forma vinculada a alguns eventos, o método DetectChanges será automaticamente chamado, sem precisarmos fazer nada, marcando as entidades como alteradas.

O problema disso está no fato de que cada vez que chamamos o DetectChanges ele precisa percorrer todas as entidades do contexto. Quanto mais entidades envolvidas, maior o tempo gasto.

AsNoTracking x AutoDetectChanges

Utilizar o AsNoTracking significa que as entidades serão lidas da origem de dados mas não serão mantidas no contexto. Com isso não poderão ser atualizadas posteriormente.

É claro que ao usar o AsNoTracking o AutoDetectChanges também não se aplicará sobre essas entidades, é uma consequencia. Porém o AsNoTracking é uma forma radical de resolver o problema para situações apenas de leitura de dados.

Exemplo do AsNoTracking :

var resultado=(from x in ne.Customers
where x.CustomerID==cliente
select x).AsNoTracking();

Imagine porém situações em que você precisará fazer muitos inserts ou updates nas entidades. O AsNoTracking não pode ser utilizado, porém por serem muitas entidades o AutoDetectChanges causa uma perda de performance.  Assim podemos otimizar muitos inserts e updates no contexto de uma forma simples :

  • Desliga-se o autodetectchanges
  • Realiza-se as mudanças
  • Chama-se o método detectchanges para fazer a detecção de mudanças

Exemplo de AutoDetectChanges :

 context.Configuration.AutoDetectChangesEnabled = false;

// Realiza-se as mudanças aqui

context.ChangeTracker.DetectChanges();

 

Desta forma otimiza-se consideravelmente o código

Resumindo

Veja o quadro abaixo as diferenças entre os dois :

  Está no Contexto Permite atualizações Identifica Mudanças Automaticamente Quando utilizar
AsNoTracking Não Não Não Somente leitura de dados
AutoDetectChanges=true Sim Sim Sim Leitura e gravação de registros individuais
AutoDetectChanges=false Sim Sim Não Atualizações em lote

Referência

http://blog.staticvoid.co.nz/2012/5/7/entityframework_performance_and_autodetectchanges



Categories: .NET , Entity Framework


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 1/20/2018 6:00:00 PM
nome: Wesley
email: wel.santana@hotmail.com
comentário:
Ótima explicação.
Obrigado.


data: 3/20/2016 4:21:00 PM
nome: Plinio Teixeira
email: Plinio.teixeira@outlook.com
comentário:
Muito bom o artigo. Como sempre.
Transparente e objetivo.


data: 1/29/2013 11:18:00 AM
nome: Alfredo Lotar
email: asprs@bol.com.br
comentário:
Muito bom o artigo. Deixa bem claro quando usar AsNoTracking e/ou AutoDetectChanges.

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br