Compartilhar via


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.