Entity Framework Core – Diferencia entre Add, Entry y Attach

Vamos a ver la diferencia entre los métodos Add, Entry y Attach de Entity Framework Core.

Add es para indicarle a Entity Framework que vamos a querer insertar un nuevo registro en la base de datos.

En cambio, Entry y Attach los usamos en escenarios donde el registro ya existe en la base de datos, y simplemente queremos hacer algún tipo de modificación sobre el mismo.

En el caso de Attach, se analiza el objeto de manera recursiva y se toman todos las entidades relacionadas en cuenta. En el caso de Entry, solamente se toma el objeto al que le haces el Entry, y no sus entidades relacionadas. Por ejemplo: Supongamos que tenemos las entidades Estudiante y Contacto. Donde a cada Estudiante le corresponde un listado de Contactos (relación uno a muchos). Vamos a ver un ejemplo de Entry:


Estudiante estudiante1;
using (var context = new ApplicationDbContext())
{
   estudiante1 = context.Estudiantes.First();
}

estudiante1.Contactos = new List<Contacto>();
estudiante1.Contactos.Add(new Contacto() { Nombre = "Contacto 1" });

using (var context = new ApplicationDbContext())
{
   var entry = context.Entry(estudiante1);
   // Se va a actualizar solamente la entidad Estudiante, sin tomar en cuenta el Contacto
   entry.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
   context.SaveChanges();
}

Solo se actualiza el Estudiante. Sin embargo, si usamos Attach:


Estudiante estudiante1;

using (var context = new ApplicationDbContext())
{
   estudiante1 = context.Estudiantes.First();
}

estudiante1.Contactos = new List<Contacto>();
estudiante1.Contactos.Add(new Contacto() { Nombre = "Contacto 1" });

using (var context = new ApplicationDbContext())
{
   var attach = context.Attach(estudiante1);
   // Se va a actualizar el estudiante, y se va a crear un nuevo contacto.
   attach.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
   context.SaveChanges();
}

Entonces se actualiza el estudiante y se crea un contacto. Es importante destacar que si el contacto tiene su llave primaria colocada, entonces por defecto no se va a hacer nada con el contacto.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s