Introducción

Ef core 2 nos provee dos métodos a través del DbSet para insertar objetos dentro de nuestra aplicación. Add() que nos permite insertar un único objeto y AddRange() para insertar múltiples objetos.

Siguiendo nuestro ejemplo en ParkingApp vamos a utilizar los dos métodos para insertar categorías, vehículos y estacionamientos.

Al utilizar los métodos para insertar que nos provee ef core 2, el contexto trackea la entidad y le cambia su estado a Added. Para efectuar la inserción del objeto en la base de datos es necesario ejecutar SaveChanges() en el contexto.

En ParkingApp establecimos tres tipo de categorías distintas para los vehículos. Estas categorías son:

  • Auto
  • Camión
  • Moto

Insertando categorías en ParkingApp

Creamos una lista con las categorías, recorremos cada una a través del método de extensión .ForEach validando si existe o no la categoría en la base de datos y en caso de no existir, la trackeamos en el contexto para luego proceder a guardarla.

private static void InsertCategories()
{
    var categories = new List<Category>()
    {
        new Category { Name = "Auto"},
        new Category { Name = "Camion" },
        new Category { Name = "Moto" }
    };

    categories
        .ForEach(p =>
        {
            if (!_context.Categories.Any(x => x.Name == p.Name))
                _context.Add(p);
        });

    _context.SaveChanges();
}

Nuestra consola nos muestra los comandos SQL ejecutados por ef core 2

insert categories ef core
insert categories ef core

En este caso vemos como se insertan las tres categorías ya que no existen. 

Insertando múltiples vehículos en ParkingApp

Tal como lo hicimos con la categorías, creamos una lista de vehículos a insertar con una categoría asociada. A esta lista de vehículos le aplicamos un filtro para obtener los vehículos que no existan actualmente en la base de datos. Y sobre esta lista final hacemos la inserción múltiple haciendo uso del método AddRange().

private static void InsertMultipleVehicles()
{
    var cars = new List<Vehicle>
    {
        new Vehicle { CateogoryId = 1, LicensePlate = "NJS981" },
        new Vehicle { CateogoryId = 2, LicensePlate = "KSJ198" },
        new Vehicle { CateogoryId = 1, LicensePlate = "LSK123" },
        new Vehicle { CateogoryId = 3, LicensePlate = "SHD290" },
    };

    var carsNotExists = cars.Where(p => !_context.Vehicles.Any(x => x.LicensePlate == p.LicensePlate));

    _context.AddRange(carsNotExists);
    _context.SaveChanges();
}

 Nuestra consola nos muestra los comandos SQL ejecutados por ef core 2

insert vehicles ef core
insert vehicles ef core

El resultado de los comandos SQL es idéntico en cuanto a estructura que el de categorías, ¿Porque?. Esto ocurre porque en las categorías fuimos trackeando cada una de las categorías y luego de la interacción hicimos el SaveChanges(), lo cual ef core lo interpreta como múltiples inserciones. En cambio si dentro del método de extensión .ForEach() hubiésemos ejecutado SaveChanges() luego de cada Add() ef core ejecutaba inserciones individuales de objetos categoría.

Insertando un único objeto Parking

Hasta el momento hicimos dos inserciones múltiples en nuestra base de datos. En este caso, haremos una inserción individual de un estacionamiento asociando a un vehículo y validando que no exista el numero de ticket guardado en la base de datos.

private static void InsertParking()
{
    var newParking = new Parking
    {
        VehicleId = 1,
        Ticket = "6475846372",
        CheckIn = DateTime.Now
    };

    if (_context.Parkings.Any(p => p.Ticket == newParking.Ticket))
        return;

    _context.Add(newParking);
    _context.SaveChanges();
}

Nuestra consola nos muestra los comandos SQL ejecutados por ef core 2

insert parking ef core
insert parking ef core

¿Que tener en cuenta en múltiples inserciones (Batch)?

  • Cada proveedor de datos es responsable del tamaño del lote. El valor predeterminado de SQL Server es de 1000 comandos SQL.
  • Si existe una mayor cantidad de comandos, ef core los agrupara en varios conjuntos según el tamaño del proveedor de datos.

 

El ejemplo de este articulo esta basado en el ejemplo que venimos trabajando de ParkingApp.

GITHUB /mpetrinidev

/blog-parking-ef-core-2

Branch [insertObjects]

¡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