J'utilise EF 6. J'essaie d'insérer environ 200.000 entités tout en sauvegardant les modifications de base de données après chaque 100 entités.Entity Framework bulk insert unreal lent
Le problème est qu'il a fallu 11 heures pour sauver 50.000 entités, et il est toujours en retard. Je cours ceci avec WebJobs, et le travail est édité sur la même webapp d'azure que le site Web principal. Est-ce le problème à cause de cela et WebJob n'a pas assez de ressources, ou d'économiser après 100 entités, ou l'approche?
Méthode
public void SaveLeadsForBuyer(ISenderModel model)
{
var rowCounter = 0;
foreach (var deliveryRecord in model.Customers.Select(customerModel => new DeliveryRecord()
{
BuyerId = model.Buyer.Id,
AspNetUserId = customerModel.Id,
DeliveryType = model.Buyer.DeliveryType,
CreatedOn = DateTime.UtcNow
}))
{
++rowCounter;
_unit.Repository<DeliveryRecord>().Insert(deliveryRecord);
_unit.SaveChangesPartially(rowCounter, 100);
}
_unit.SaveChanges();
}
Aide
public static class UnitOfWorkHelper
{
/// <summary>
/// Helper method triggers SaveChanges() after amount of rows provided through "amount" parameter in method
/// </summary>
/// <param name="unit">UnitOfWork object</param>
/// <param name="count">Current amount of rows</param>
/// <param name="saveCount">Amount when to save changes to database</param>
public static void SaveChangesPartially(this IUnitOfWorkAsync unit, int count, int saveCount)
{
if (count % saveCount == 0)
{
unit.SaveChanges();
}
}
}
EF est très mauvais pour l'insertion en masse, 'INSERT SELECT' fonctionnera 1000000 fois plus vite que EF. –
Ce n'est pas ** un "encart groupé" que vous faites - vous devez regarder des composants comme ['EntityFramework.BulkInsert'] (https://efbulkinsert.codeplex.com/) ou autres (* * recherche ** sur votre moteur de recherche préféré pour "Entity Framework bulk insert" - vous en trouverez plusieurs, choisissez celui que vous préférez) –