AnswerBun.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!

Related Questions

Saber el tipo de datos de un campo de una tabla FireBird

1  Asked on November 7, 2021 by fernando-de-jesus-basurto

   

Crear un Archivo PDF de un Byte Array?

2  Asked on November 7, 2021 by mark-dev

     

Activar Select Box segun checkbox seleccionado

2  Asked on November 7, 2021 by maha1982

       

Usar entity framework con Base de datos existente

1  Asked on November 7, 2021 by miquel

   

hctreemap2 de dos niveles –> Error: Can’t subset columns that don’t exist

1  Asked on November 7, 2021 by alejandro-erazo-bolaos

     

Problema con controllers de MVC .NET

0  Asked on November 7, 2021 by jorge-gonzales

         

como mover botones de ruta en la pagina angular 8/9

1  Asked on November 7, 2021 by kenny-cifuentes

       

Consulta múltiples tablas con laravel eloquent

1  Asked on November 4, 2021 by erain-moya

       

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir