Detección automática de cambios

Al usar la mayoría de las entidades POCO, la determinación de cómo ha cambiado una entidad (y, por tanto, qué actualizaciones deben enviarse a la base de datos) se controla mediante el algoritmo Detectar cambios. Detectar cambios funciona mediante la detección de las diferencias entre los valores de propiedad actuales de la entidad y los valores de propiedad originales que se almacenan en una instantánea cuando se consulta o se adjunta la entidad. Las técnicas que se muestran en este tema se aplican igualmente a los modelos creados con Code First y EF Designer.

De forma predeterminada, Entity Framework ejecuta Detectar cambios automáticamente cuando se llama a los métodos siguientes:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Deshabilitación de la detección automática de cambios

Si realiza un seguimiento de una gran cantidad de entidades en el contexto y llama a uno de estos métodos muchas veces en un bucle, puede obtener mejoras de rendimiento significativas desactivando la detección de cambios durante la duración del bucle. Por ejemplo:

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;
    }
}

No olvide volver a habilitar la detección de cambios después del bucle: hemos usado un try/finally para asegurarse de que siempre se vuelve a habilitar aunque el código del bucle produzca una excepción.

Una alternativa a deshabilitar y volver a habilitar es dejar desactivada la detección automática de cambios en todo momento y llamar a context.ChangeTracker.DetectChanges explícitamente o usar servidores proxy de seguimiento de cambios diligentemente. Ambas opciones son avanzadas y pueden introducir fácilmente errores sutiles en la aplicación para usarlos con cuidado.

Si necesita agregar o quitar muchos objetos de un contexto, considere la posibilidad de usar DbSet.AddRange y DbSet.RemoveRange. Estos métodos detectan automáticamente los cambios una vez completadas las operaciones de adición o eliminación.