entity-framework-eliminar-registros

Eliminación de datos en Entity Framework

  • 3 min

En Entity Framework, la eliminación de registros es una de las operacionees CRUD fundamentales, y la última que nos falta por ver.

La eliminación de registros implica borrar en la base de datos entidades existentes (obvio,😊) Para ello, Entity Framework proporcionan los métodos Remove y RemoveRange.

Al igual que en el resto de operaciones, cuando eliminamos un registro del DbContext, estas no se ejecutan se ejecutan inmediatamente en la base de datos.

En su lugar, EF los marca para su eliminación. Los cambios se harán efectivos en la base de datos cuando invoquemos al método al método SaveChanges.

Eliminación de registros con Remove

El método Remove se utiliza para eliminar un único registro de la base de datos. Este método marca la entidad como “eliminada” en el contexto,

DbContext.Remove(entity);

Supongamos que tenemos una entidad Producto y queremos eliminar un producto específico de la base de datos:

using (var context = new MiContexto())
{
    // Buscamos el producto a eliminar
    var producto = context.Productos.Find(1); // Supongamos que el ID es 1

    if (producto != null)
    {
        // Marcamos el producto para eliminación
        context.Productos.Remove(producto);

        // Aplicamos los cambios en la base de datos
        context.SaveChanges();
    }
}

En este ejemplo:

  1. Buscamos el producto con ID 1 utilizando el método Find.
  2. Si el producto existe, lo marcamos para eliminación con Remove.
  3. Finalmente, llamamos a SaveChanges para aplicar la eliminación en la base de datos.

Eliminación múltiple con RemoveRange

El método RemoveRange es una extensión de Remove que permite eliminar múltiples registros de una sola vez.

Esto es útil cuando necesitamos eliminar una colección de entidades, ya que reduce el número de operaciones de base de datos.

DbContext.RemoveRange(entities);

Supongamos que queremos eliminar todos los productos que tienen un precio menor a 10:

using (var context = new MiContexto())
{
    // Buscamos los productos a eliminar
    var productosBaratos = context.Productos
                                  .Where(p => p.Precio < 10)
                                  .ToList();

    if (productosBaratos.Any())
    {
        // Marcamos los productos para eliminación
        context.Productos.RemoveRange(productosBaratos);

        // Aplicamos los cambios en la base de datos
        context.SaveChanges();
    }
}

En este ejemplo:

  1. Utilizamos LINQ para filtrar los productos con un precio menor a 10.
  2. Si hay productos que cumplen la condición, los marcamos para eliminación con RemoveRange.
  3. Llamamos a SaveChanges para aplicar la eliminación en la base de datos.

Al igual que AddRange, DeleteRange puede reducir el número de consultas a la base de datos.

Pero no es una operación bulk. Es decir, que el rendimiento sigue siendo mejorable 😅

Casos frecuentes

Eliminación en cascada

Entity Framework soporta la eliminación en cascada, lo que significa que si una entidad tiene relaciones con otras entidades, estas también pueden ser eliminadas automáticamente. Esto se configura mediante la Fluent API o Data Annotations.

modelBuilder.Entity<Producto>()
            .HasMany(p => p.DetallesPedido)
            .WithOne(d => d.Producto)
            .OnDelete(DeleteBehavior.Cascade);

Por ejemplo, si un Producto tiene una relación 1con DetallesPedido, y configuramos la eliminación en cascada, al eliminar un producto, todos sus detalles de pedido también serán eliminados.

Eliminación sin cargar la entidad

En algunos casos, es posible eliminar un registro sin cargarlo previamente en memoria. Esto se logra creando una instancia de la entidad con solo el ID y marcándola para eliminación.

using (var context = new MiContexto())
{
    var producto = new Producto { Id = 1 }; // Solo necesitamos el ID
    context.Productos.Attach(producto);
    context.Productos.Remove(producto);
    context.SaveChanges();
}

Manejo de excepciones

Es importante manejar excepciones al realizar operaciones de eliminación, especialmente si hay restricciones de integridad referencial en la base de datos.

try
{
    context.SaveChanges();
}
catch (DbUpdateException ex)
{
    Console.WriteLine("Error al eliminar el registro: " + ex.Message);
}

Por ejemplo, si intentamos eliminar un registro que está siendo referenciado por otra tabla, se lanzará una excepción.