SqlBulkCopy y Entity Framework

.net c# entity-framework sqlbulkcopy

Pregunta

Mi proyecto actual consta de 3 capas estándar: datos, negocios y presentación. Me gustaría usar entidades de datos para todas mis necesidades de acceso a datos. Parte de la funcionalidad de la aplicación será que deberá copiar todos los datos de un archivo plano en una base de datos. El archivo no es tan grande, así que puedo usar SqlBulkCopy. He encontrado varios artículos sobre el uso de la clase SqlBulkCopy en .NET. Sin embargo, todos los artículos utilizan DataTables para mover datos de un lado a otro.

¿Hay alguna forma de usar entidades de datos junto con SqlBulkCopy o tendré que usar DataTables?

Respuesta experta

Como complemento a la respuesta de @DaveHogan,

Ahora hay nuevas bibliotecas que permiten realizar inserciones masivas (utilizando SqlBulkCopy bajo el capó) para Entity Framework utilizando entidades de datos en lugar de DataTable.

Descargo de responsabilidad : soy el propietario del proyecto Entity Framework Extensions

Esta biblioteca no es gratuita pero permite realizar fácilmente:

  • BulkSaveChanges
  • BulkInsert
  • Actualización masiva
  • BulkDelete
  • BulkMerge

Debajo del capó, se utiliza SqlBulkCopy. Usar el método de extensión es mucho más fácil / rápido que codificar una solución personalizada para que lo use cada inserto masivo.

Ejemplo

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

bajo rendimiento

Lamento que tengas un bajo rendimiento,

Asegúrese de no incluir el tiempo de algún error común, como olvidarse de JIT Compile, utilizando Agregar en lugar de AddRange, lo que afecta el rendimiento de la prueba pero no está relacionado con nuestra biblioteca.

La mayoría de las personas informan que obtienen una mejora de rendimiento de entre 25 y 50 veces al excluir todos los errores comunes de referencia de rendimiento.

Ver: Extensiones de Entity Framework - Benchmark


Respuesta popular

Tendrá que convertir las entidades a un IDataReader o DataTable.

Hay una pequeña clase de ayuda diseñada para ayudar con: http://archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId=389

EDITAR: el enlace msdn está roto, la copia alternativa se puede encontrar aquí: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

Entonces puedes usar SqlBulkCopy así:

var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader()); 


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é