Detectar alterações automáticas
Ao usar a maioria das entidades POCO, a determinação de como uma entidade foi alterada (e, portanto, quais atualizações precisam ser enviadas para o banco de dados) é tratada pelo algoritmo Detectar Alterações. A detecção de alterações funciona detectando as diferenças entre os valores de propriedade atuais da entidade e os valores de propriedade originais armazenados em um instantâneo quando a entidade foi consultada ou anexada. As técnicas mostradas neste tópico se aplicam igualmente a modelos criados com o Code First e com o EF Designer.
Por padrão, o Entity Framework executa Detectar Alterações automaticamente quando os seguintes métodos são chamados:
- DbSet.Find
- DbSet.Local
- DbSet.Add
- DbSet.AddRange
- DbSet.Remove
- DbSet.RemoveRange
- DbSet.Attach
- DbContext.SaveChanges
- DbContext.GetValidationErrors
- DbContext.Entry
- DbChangeTracker.Entries
Desabilitar a detecção automática de alterações
Se você estiver acompanhando muitas entidades em seu contexto e chamar um desses métodos muitas vezes em um loop, poderá obter melhorias significativas de desempenho desativando a detecção de alterações durante o loop. Por exemplo:
using (var context = new BloggingContext())
{
try
{
context.Configuration.AutoDetectChangesEnabled = false;
// Make many calls in a loop
foreach (var blog in aLotOfBlogs)
{
context.Blogs.Add(blog);
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}
Não se esqueça de habilitar novamente a detecção de alterações após o loop —, usamos uma tentativa/finalmente para garantir que ela esteja sempre habilitada novamente, mesmo que o código no loop gere uma exceção.
Uma alternativa para desabilitar e reabilitar é deixar a detecção automática de alterações desativada o tempo todo e qualquer contexto de chamada. ChangeTracker.DetectChanges explicitamente ou use proxies de controle de alterações diligentemente. Ambas as opções são avançadas e podem facilmente introduzir bugs sutis em seu aplicativo, portanto, use-os com cuidado.
Se você precisar adicionar ou remover muitos objetos de um contexto, considere usar DbSet.AddRange e DbSet.RemoveRange. Esses métodos detectam automaticamente alterações apenas uma vez após a conclusão das operações de adição e remoção.