TransWikia.com

Entity framework Attach actualiza sólo las propiedades modificadas ¿por qué?

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?

https://blog.oneunicorn.com/2012/03/12/secrets-of-detectchanges-part-3-switching-off-automatic-detectchanges/

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP