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.