Introducción

EF core 2 nos provee dos mecanismos para actualizar objetos. El primero consiste en obtener el objeto, actualizamos los valores de las propiedades que necesitamos modificar y guardamos nuestros cambios con SaveChanges() sobre el contexto. El segundo consiste en utilizar el método Update() sobre el DbSet<T> de la entidad.

Para eliminar objetos, tenemos que hacer uso del método Remove() sobre el DbSet<T>. 

Actualizar un objeto

Para comenzar, vamos a utilizar el primer mecanismo anteriormente mencionado. Vamos a actualizar la propiedad de salida del estacionamiento de un vehículo. 

private static void UpdateParking()
{
    var existingParking = _context.Parkings.Find(1);
    if (existingParking == null) return;

    existingParking.CheckOut = DateTime.Now;

    _context.SaveChanges();
}

Como verán, es un procedimiento muy sencillo. El resultado de los comandos SQL que ejecuta ef core 2 es el siguiente

update_efCore2
update_efCore2

Obtiene el estacionamiento con Id = 1 y aplica el comando SQL UPDATE para actualizar el campo CheckOut.

¿Como sabe el contexto que tiene que actualizar?

Es mágico, si.

Esto es posible porque el contexto trackea a la entidad parking desde el momento de obtenerla hasta el momento que se llama a SaveChanges(). Esto permite saber que propiedad exacta fue modificada y ejecutar un comando SQL eficiente para actualizar únicamente ese campo. 

Actualizar múltiples objetos

Tal como es posible cuando realizamos inserciones con ef core 2, también es posible actualizar múltiples objetos en nuestra base de datos.

private static void MultipleUpdates()
{
    var categories = _context.Categories.ToList();
    if (categories == null || categories.Count == 0) return;

    var i = 0;
    categories.ForEach(p => p.Name += " " + i++);

    _context.SaveChanges();
}

En este caso, obtenemos todas las categorías e iteramos sobre ellas asignándole un numero a cada una. El resultado de los comandos SQL que ejecuta ef core 2 es el siguiente

multiple_updateEfCore2
multiple_updateEfCore2

Obtenemos la lista de categorías y aplica los múltiples updates para cada categoría con sus nuevos valores.

Usar el método Update del DbSet<T> para actualizar objetos

Muchas veces ocurre en una aplicación que tenemos que usar una instancia individual de nuestro contexto para cada operación. Esto depende siempre de como armemos la arquitectura de nuestra aplicación, pero es un escenario muy común que puede ocurrir. Para eso, para actualizar objetos debemos utilizar el método Update() del DbSet<T>.

private static void UpdateParkingAnotherInstance()
{
    var existingParking = _context.Parkings.Find(1);
    if (existingParking == null) return;

    existingParking.CheckOut = DateTime.Now;

    using (var newContext = new ParkingContext())
    {
        newContext.Parkings.Update(existingParking);
        newContext.SaveChanges();
    }
}

El resultado de los comandos SQL que ejecuta ef core 2 es el siguiente

updateAnotherInstance_efCore2
updateAnotherInstance_efCore2

En este caso, el comando SQL de update actualiza todos los campos sin importar cual haya sido cambiado. Esta es una diferencia fundamental con la anterior forma de actualizar objetos en ef core 2 donde el contexto trackea a la entidad.

Eliminar un objeto

Para eliminar objetos en ef core 2 es necesario que el contexto trackee el objeto y los marque como eliminados para que ejecute el comando SQL delete en la base de datos. Para eliminar objetos, se debe usar el método Remove() del DbSet<T> de la entidad.

private static void DeleteParking()
{
    var existingParking = _context.Parkings.Find(1);
    if (existingParking == null) return;

    _context.Parkings.Remove(existingParking);
    _context.SaveChanges();
}

El método Remove() solo asigna el estado de la entidad a Deleted

El resultado de los comandos SQL que ejecuta ef core 2 es el siguiente

delete_efCore2
delete_efCore2

Eliminar múltiples objetos

Para eliminar múltiples objetos en ef core 2 es necesario hacer uso del método RemoveRange().

private static void MultipleDeletes()
{
    var vehicles = _context.Vehicles.ToList();
    if (vehicles.Count == 0) return;

    _context.Vehicles.RemoveRange(vehicles);
    _context.SaveChanges();
}

Obtenemos todos los vehículos de nuestra base de datos y procedemos a eliminarlos con RemoveRange(vehicles);

El resultado de los comandos SQL que ejecuta ef core 2 es el siguiente

multipleDeletes_efCore2
multipleDeletes_efCore2

Como verán, ejecuta los múltiples comandos SQL Delete para la tabla Vehículos.

GITHUB /mpetrinidev

/blog-parking-ef-core-2

Branch [update-delete]

¡Si te gusto el articulo, compártelo con tus contactos en las redes sociales!

Escribe una respuesta a este comentario

avatar
500
  Subscribe  
Notificar de