SqlBulkCopy et Entity Framework

.net c# entity-framework sqlbulkcopy

Question

Mon projet actuel consiste en 3 couches standard: données, activité et présentation. J'aimerais utiliser des entités de données pour tous mes besoins d'accès aux données. Une partie des fonctionnalités de l'application nécessitera la copie de toutes les données d'un fichier plat dans une base de données. Le fichier n'est pas si gros que je peux utiliser SqlBulkCopy. J'ai trouvé plusieurs articles concernant l'utilisation de la classe SqlBulkCopy dans .NET. Cependant, tous les articles utilisent DataTables pour déplacer des données dans les deux sens.

Est-il possible d'utiliser des entités de données avec SqlBulkCopy ou devrai-je utiliser DataTables?

Réponse d'expert

En complément de la réponse @DaveHogan,

Il existe maintenant de nouvelles bibliothèques qui permettent d'effectuer une insertion en bloc (en utilisant SqlBulkCopy sous le capot) pour Entity Framework en utilisant des entités de données au lieu de DataTable.

Avertissement : je suis propriétaire du projet Entity Framework Extensions

Cette bibliothèque n'est pas gratuite mais permet d'effectuer facilement:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

SqlBulkCopy est utilisé sous le capot. L'utilisation de la méthode d'extension facilite beaucoup / plus rapidement que de coder une solution personnalisée pour chaque insertion en bloc à utiliser.

Exemple

// Easy to use
context.BulkSaveChanges();

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

mauvaise performance

Je suis désolé que vous obteniez de mauvaises performances,

Assurez-vous de ne pas inclure le temps d'une erreur commune telle que l'oubli de JIT Compile, en utilisant Add au lieu de AddRange, ce qui a un impact sur les performances du test mais n'est pas lié à notre bibliothèque.

La plupart des gens signalent une amélioration de la performance de 25 à 50 fois en excluant toutes les erreurs courantes de référence de performance.

Voir: Entity Framework Extensions - Benchmark


Réponse populaire

Vous devrez convertir les entités en IDataReader ou DataTable.

Il existe une petite classe d'assistance conçue pour aider à: http://archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId=389

EDIT: le lien msdn est cassé, une copie de remplacement peut être trouvée ici: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

Ensuite, vous pouvez utiliser SqlBulkCopy comme ceci:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow