Stack Overflow en español Asked by Patxi on November 15, 2020
Estoy usando el siguiente código para actualizar muchas entidades en la BD. Utilizo AutoDetectChangesEnabled=false
por eso, porque si no le cuesta mucho tiempo. De esta manera se reduce mucho el tiempo.
Aquí modifico la lista de ítems
ActualizarItems(ítems);
public void ActualizarItems(List<Item> ítems){
DbContext.Configuration.AutoDetectChangesEnabled = false;
foreach (var item in items)
{
DbSet.Attach(item);
}
DbContext.Configuration.AutoDetectChangesEnabled = true;
DbContext.SaveChanges();
}
Pero mi pregunta es ¿por qué funciona sin indicar explícitamente las propiedades que han cambiado, es decir, sin poner la línea de modificación después de Attach?
DbSet.Attach(item);
DbContext.Entry(item).Property(u => u.Puntos).IsModified = true;
Yo pensaba que siempre había que indicar las propiedades que se habían modificado, pero con el código que he puesto no es necesario hacerlo. Attach
detecta las propiedades que han cambiado respecto a lo que hay en BD y genera el comando Update añadiendo sólo las propiedades que han cambiado.
¿Alguien me puede explicar este comportamiento?
Edición
He hecho pruebas. El estado de los objetos antes y después del Attach
es Unchanged
. Pero justo después de activar AutoDetectChangesEnabled
, el estado pasa a Modified
.
public void ActualizarItems(List<Item> ítems){
DbContext.Configuration.AutoDetectChangesEnabled = false;
foreach (var item in items)
{
//Aquí el estado es sin cambios
DbSet.Attach(item);
//Aquí el estado es sin cambios
}
DbContext.Configuration.AutoDetectChangesEnabled = true;
//Aquí el estado es modificado
DbContext.SaveChanges();
}
El caso es que este comportamiento desconcertante me viene bien, ya que evita tener que indicar explicitamente las propiedades que modifico, él las detecta.
Pero no me da seguridad utilizar esto así hasta que no tenga una respuesta lógica.
No sé si esto nos ayuda. ¿podeis echarle un vistazo?
Entity Framework Automatic Detect Changes
Si analizamos lo comentado en el link
comenta que compara la entidad con lo que tiene en el snapshot
cuando la entidad ha sido consultada o esta adjunta, o sea si haces un query a la entidad y luego realizas el attach esa comparacion es la que anulas
lo que tendrias que intentar seria
DbContext.Configuration.AutoDetectChangesEnabled = false;
foreach (var item in items)
{
DbSet.Attach(item);
}
DbContext.SaveChanges();
DbContext.Configuration.AutoDetectChangesEnabled = true;
realiza el SaveChanges() antes de volver habilitar el "auto detect changes"
Answered by Leandro Tuttini on November 15, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP