Automatisches Erkennen von Änderungen

Bei Verwendung der meisten POCO-Entitäten wird die Bestimmung der Änderung einer Entität (und daher, welche Aktualisierungen an die Datenbank gesendet werden müssen) vom Algorithmus zum Erkennen von Änderungen behandelt. Die Erkennung von Änderungen funktioniert, indem die Unterschiede zwischen den aktuellen Eigenschaftswerten der Entität und den ursprünglichen Eigenschaftswerten erkannt werden, die in einer Momentaufnahme gespeichert sind, wenn die Entität abgefragt oder angefügt wurde. Die in diesem Thema dargestellten Techniken gelten jeweils für Modelle, die mit Code First und dem EF-Designer erstellt wurden.

Standardmäßig führt Entity Framework die Erkennung von Änderungen automatisch aus, wenn die folgenden Methoden aufgerufen werden:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Deaktivieren der automatischen Erkennung von Änderungen

Wenn Sie viele Entitäten in Ihrem Kontext verfolgen und eine dieser Methoden viele Male in einer Schleife aufrufen, können Sie erhebliche Leistungsverbesserungen erzielen, indem Sie die Erkennung von Änderungen für die Dauer der Schleife ausschalten. Beispiel:

using (var context = new BloggingContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var blog in aLotOfBlogs)
        {
            context.Blogs.Add(blog);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

Vergessen Sie nicht, die Erkennung von Änderungen nach der Schleife wieder zu aktivieren. Wir haben ein try/finally verwendet, um sicherzustellen, dass die Erkennung immer wieder aktiviert wird, auch wenn der Code in der Schleife eine Ausnahme auslöst.

Eine Alternative zur Deaktivierung und erneuten Aktivierung besteht darin, die automatische Erkennung von Änderungen stets ausgeschaltet zu lassen und entweder context.ChangeTracker.DetectChanges explizit aufzurufen oder Proxys zur Änderungsverfolgung sorgfältig zu verwenden. Beide Optionen sind fortgeschritten und können leicht subtile Fehler in Ihre Anwendung einbringen, also verwenden Sie sie mit Vorsicht.

Wenn Sie viele Objekte aus einem Kontext hinzufügen oder entfernen müssen, sollten Sie DbSet.AddRange und DbSet.RemoveRange verwenden. Diese Methoden erkennen Änderungen automatisch nur einmal, nachdem die Vorgänge zum Hinzufügen und Entfernen abgeschlossen sind.