Insertion en bloc à l'aide d'EntityFramework Extended

Selon ceci , l'insertion en bloc dans l'entité peut être faite en utilisant le code suivant:

var customers = GetCustomers(); db.Customers.AddRange(customers); db.SaveChanges(); 

J'ai utilisé SQL Profiler pour vérifier combien de requêtes d'insertion ont été exécutées et j'ai vu qu'il y avait un insert pour chaque élément de la list.

entrez la description de l'image ici

Pourquoi?

AddRange

Ajouter une plage n'effectue pas de BulkInsert, elle détecte simplement ChangeChanges une fois que toutes les entités ont été ajoutées à l'set.

La méthode DetectChange peut être TRÈS lente.

Voir: Entity Framework – Performances DetectChanges

Comme vous l'avez remarqué, il enregistre les entités une par une dans la database qui est INSANEMENT lente.

EF.Extended

Cette bibliothèque n'est plus prise en charge et il n'y a pas de fonctionnalité d'insertion en bloc.

Bibliothèque d'insertion en bloc

Bulk Insert:

  • Entity Framework Extensions ( Payé mais pris en charge )
  • EntityFramework.BulkInsert ( n'est plus supporté )
  • EFUtilities ( n'est plus supporté )

Attention, les deux bibliothèques libres ne prennent pas en charge tous les inheritances et associations.


Disclaimer : Je suis le propriétaire du projet Entity Framework Extensions

En plus de Bulk Insert, cette bibliothèque vous permet d'effectuer toutes les opérations en masse:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge
  • BulkSynchronize

Exemple:

 // Easy to use context.BulkSaveChanges(); // Easy to customize context.BulkSaveChanges(bulk => bulk.BatchSize = 100); // Perform Bulk Operations context.BulkDelete(customers); context.BulkInsert(customers); context.BulkUpdate(customers); // Customize Primary Key context.BulkMerge(customers, operation => { operation.ColumnPrimaryKeyExpression = customer => customer.Code; }); 

C'est ainsi que l'EF6 insère le «bulk», ce qui ne se fait pas en masse, plutôt rangée par rangée. Par conséquent, la performance est nulle.

Utilisez plutôt EF.BulkInsert ou EFUtilities .

Mettre à jour:

DbSet<T>.AddRange() fait partie de l'API embeddede, de cette façon vous n'utilisez pas EF.Extended ou toute autre bibliothèque tierce.