Dapper insertar o actualizar?

dapper

Pregunta

No he empezado a utilizar Dapper todavía, pero hoy lo encontré mientras investigaba sobre inserciones / actualizaciones masivas. Actualmente estoy usando EF6, pero me gustaría ver el uso de Dapper en el futuro de mi material a granel. Para esta aplicación podría haber ~ 15k registros pero tengo otras aplicaciones que podrían ser ~ 100k registros.

Estoy tratando de investigar una forma en que pueda convertir el siguiente código EF en Dapper. Todo lo que hace es leer en un registro de un archivo, ver si ese empleado existe en la base de datos, si es así actualiza las propiedades con los valores del archivo y si no crea un nuevo objeto con los valores del archivo.

No pude encontrar ningún ejemplo cuando miraba alrededor. Todo lo que pude encontrar fue cómo hacer un simple inserto o una actualización. Realmente no encontré buenos ejemplos de inserción / actualización masiva. Es muy posible que todavía no entiendo cómo usar Dapper.

¿Cómo haría esto con Dapper?

int count = 1;
using (ctx = new DataContext())
{
    ctx.Configuration.AutoDetectChangesEnabled = false;      
    ctx.Configuration.ValidateOnSaveEnabled = false;

    while ((record = srFile.ReadLine()) != null)
    {
        int employeeId = int.Parse(record.Substring(2, 8));

        bio_employee employee = ctx.bio_employee.FirstOrDefault(e => e.emp_id == employeeId);

        if (employee != null)
        {
            SetEmployeeData(employee, record);

            ctx.Entry(employee).State = System.Data.Entity.EntityState.Modified;
        }
        else
        {
            employee = new bio_employee();
            employee.emp_id = employeeId;

            SetEmployeeData(employee, record);

            ctx.bio_employee.Add(employee);
        }


        if (count % batchSize == 0)
        {
            ctx.SaveChanges();
            ctx.Dispose();
            ctx = new DataContext();
        }

        count++;
    }
    ctx.SaveChanges();      //save any remaining
}

Respuesta experta

Dapper proporciona múltiples métodos para consultar datos pero ninguno para realizar operaciones de guardado más allá de usar un comando como lo hace normalmente sin un ORM.

Sin embargo, muchas bibliotecas de terceros cubren este escenario para Dapper:

Descargo de responsabilidad : soy el propietario del proyecto Dapper Plus

Dapper Plus es de lejos la biblioteca más rápida al proporcionar: operaciones BulkInsert, BulkDelete, BulkUpdate y BulkMerge. Puede admitir fácilmente escenarios con millones de registros.

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Employee>()
                 .Table("Employee")
                 .Identity(x => x.EmployeeID);

// SAVE entity
connection.BulkMerge(employeeList);

EDITAR : respuesta a la pregunta

Es el .BulkMerge en su DapperPlus haciendo un Upsert

Sí, BulkMerge es una operación de restauración.

También puede especificar más de una asignación para la misma entidad utilizando una clave de mapeo.

// Using key from database (x => x.EmployeeID)
DapperPlusManager.Entity<Employee>()
                 .Table("Employee");

connection.BulkInsert(employees);

// Using custom key
DapperPlusManager.Entity<Employee>("customKey")
                 .Table("Employee")
                 .Key(x => x.Code);

connection.BulkInsert("customKey", employees);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué