Manera eficiente de hacer inserciones / actualizaciones masivas con Entity Framework

Tengo una lista de entidades y quiero insertarlas en una base de datos. Si la entidad ya existe en la base de datos tal como está, entonces debe omitirse. Si está en la base de datos pero con valores diferentes, entonces necesita ser actualizado.

¿Hay alguna forma de hacer esto que no sea hacer una llamada de db por artículo?

Mi plan es probar una inserción, si se lanza una excepción de restricción única en la clave y luego hacer una actualización.

Simplemente no use Entity Framework en este caso . Solo use un procedimiento almacenado (cómo depende de la versión / enfoque que use con EF, puede que tenga que extender su DbContext o agregar un mapeo desde el modelo de entidad).

Si está utilizando SQL Server, en el procedimiento de su tienda, utilice el comando MERGE que hace exactamente lo que necesita: insertar si no existe o actualizar si lo hace. Todo en una sola consulta SQL eficiente.

EF no es adecuado para inserciones BULK. Para 1000s de registros está bien, pero los números grandes (más de 100k) son lentos.

Si planea usar EF.

  • prueba el método AddOrUpdate, (en lugar de insertar / actualizar)
  • Deshabilitar el seguimiento,
  • cometer cada 1000 registros o menos.

p.ej

 Context.Set().AddOrUpdate(poco); //... Context.Configuration.AutoDetectChangesEnabled = //.. Context.SaveChanges(); 

Si copia datos no relacionados, puede probar esas tablas en paralelo (doh)

He hecho una extensión para eso https://efbulkinsert.codeplex.com/

y es realmente simple de usar

 using(var context = new MyDbContext()) { context.BulkInsert(hugeCollectionOfEntities); } 
  1. Cree una tabla temporal: SqlCommand (string.Format (“SELECT TOP 0 * INTO {0} FROM {1} …

  2. Insertar datos a granel en él – Entity Framework Extended mencionado anteriormente tendría que modificarse para admitir el nombre de la tabla temporal, pero de lo contrario está en el camino correcto, o rodar un poco de código y usar SqlBulkCopy.

  3. Construya una instrucción MERGE.

Si mina una lista de propiedades, puede hacer (2) y (3) generics. Puedo leer y fusionar 150,000 filas en unos 20 segundos.