<p>Concernant votre remarque dans les commentaires de votre question :</p>
<p>“…SavingChanges (pour chaque<br>
enregistrement)…”</p>
<p>C’est la pire chose que vous puissiez faire ! Appeler <code>SaveChanges()</code> pour chaque enregistrement ralentit considérablement les insertions en masse. Je ferais quelques tests simples qui amélioreront très probablement les performances :</p>
<ul>
<li>
<p>Appeler <code>SaveChanges()</code> une seule fois après TOUS les enregistrements.</p>
</li>
<li>
<p>Appeler <code>SaveChanges()</code> après par exemple 100 enregistrements.</p>
</li>
<li>
<p>Appeler <code>SaveChanges()</code> après par exemple 100 enregistrements et libérer le contexte puis en créer un nouveau.</p>
</li>
<li>
<p>Désactiver la détection des changements</p>
</li>
</ul>
<p>Pour les insertions en masse, je travaille et expérimente avec un modèle comme celui-ci :</p>
<pre><code class="lang-auto">using (TransactionScope scope = new TransactionScope())
{
MyDbContext context = null;
try
{
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;
foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
{
++count;
context = AddToContext(context, entityToInsert, count, 100, true);
}
context.SaveChanges();
}
finally
{
if (context != null)
context.Dispose();
}
scope.Complete();
}
private MyDbContext AddToContext(MyDbContext context,
Entity entity, int count, int commitCount, bool recreateContext)
{
context.Set<Entity>().Add(entity);
if (count % commitCount == 0)
{
context.SaveChanges();
if (recreateContext)
{
context.Dispose();
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
}
}
return context;
}
</code></pre>
<p>J’ai un programme de test qui insère 560 000 entités (9 propriétés scalaires, aucune propriété de navigation) dans la base de données. Avec ce code, cela fonctionne en moins de 3 minutes.</p>
<p>Pour les performances, il est important d’appeler <code>SaveChanges()</code> après “beaucoup” d’enregistrements (“beaucoup” étant environ 100 ou 1000). Cela améliore également les performances de libérer le contexte après SaveChanges et d’en créer un nouveau</p>
<p><em>(Réponse tronquée)</em></p>