Heim >Backend-Entwicklung >C++ >Wie kann ich Entity Framework -Einfügungen für große Datensätze optimieren?

Wie kann ich Entity Framework -Einfügungen für große Datensätze optimieren?

DDD
DDDOriginal
2025-02-02 06:07:11297Durchsuche

How Can I Optimize Entity Framework Inserts for Large Datasets?

Entity Framework: Optimierung großer Datensatzeinfügungen

effizientes Einfügen großer Datensätze in das Entity -Framework ist für die Leistung von entscheidender Bedeutung. Eine häufige Herausforderung entsteht bei der Verwendung TransactionScope mit einer großen Anzahl von Datensätzen (z. B. 4000) und überschreitet möglicherweise das Standardtransaktionszeitüberschreitungen (10 Minuten). Der Schlüssel besteht darin, häufige Aufrufe zu SaveChanges() zu vermeiden, was den Prozess erheblich verlangsamt.

Mehrere Strategien können die Geschwindigkeit der Masseneinfügungsgeschwindigkeit drastisch verbessern:

  • Batch SaveChanges(): , anstatt nach jedem Datensatz zu speichern, rufen Sie SaveChanges() nach, nachdem alle Datensätze zum Kontext hinzugefügt wurden.
  • periodisch SaveChanges(): aufrufen SaveChanges() nach einer vorbestimmten Anzahl von Datensätzen (z. B. 100 oder 1000).
  • Kontextrecycling: call SaveChanges(), entsorgen Sie den Kontext und erstellen Sie eine neue. Dies löscht den Veränderer des Kontextes und verbessert die Leistung weiter.

Behinderung der Änderungsverfolgung (AutoDetectChangesEnabled = false) steigert auch die Effizienz während des Bulk -Betriebs.

Beispielimplementierung:

Der folgende Code zeigt einen Hochleistungs-Bulk-Insert-Ansatz unter Verwendung von Batching und Kontext-Recycling:

<code class="language-csharp">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, 1000, true); // Commit every 1000 records
        }

        context.SaveChanges();
    }
    finally
    {
        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>

Dieses Beispiel verpflichtet alle 1000 Aufzeichnungen und erstellt den Kontext nach jedem Commit. Experimentieren können zeigen, dass verschiedene commitCount -Werte (z. B. 100, 500, 1000) je nach Ihrer spezifischen Umgebung und Daten optimale Ergebnisse liefern. Der Schlüssel besteht darin, das Gleichgewicht zwischen der Minimierung von SaveChanges() -Anrufen und der effektiven Verwaltung des Speicherverbrauchs zu finden.

Das obige ist der detaillierte Inhalt vonWie kann ich Entity Framework -Einfügungen für große Datensätze optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn