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

  • Pregunta

  • Hola, 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.

                    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 esta línea: DbContext.Entry(item).Property(u => u.Puntos).IsModified = true; después de DbSet.Attach(item);?

    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. El 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?

    Gracias

    miércoles, 15 de febrero de 2017 12:55

Todas las respuestas

  • hola

    no hace falta indicarlo porque cuando realzias un simple attach la entidad realzar aun INSERT

    si debes indicarle que tipo de operacion quieres realizar

    Entity Framework Add and Attach and Entity States

    como veras si una entidad quieres adjuntarle pero solo para actualizar usarias

    context.Entry(entidad).State = EntityState.Modified; 

    Al no indicar la entidad lo mas probable es que realica un update de todas las propiedades, si estaba igual entonces no veras ningun cambio

    esto puedes validarlo si usas el Sql Profiler contra la db para inspeccionar que sql se ejecuta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de febrero de 2017 16:16
  • Pero no hace un Update de todas las propiedades sino solo de las que se han modificado, eso es lo que me extraña!!

    ¿por qué actualiza solo las propiedades que han cambiado de valor?

    Esto lo veo con el Profiler.


    • Editado Datos miércoles, 15 de febrero de 2017 16:31
    miércoles, 15 de febrero de 2017 16:30
  • hola

    Entity Framework Automatic Detect Changes

    si analizamos lo comentado en el link

    comenta que compara la entidad con lo que tiene en el "snapshot when the entity was queried or attached"

    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"

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de febrero de 2017 21:21