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.
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:
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:
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.