Grundlagen zu SaveChanges

DbContext.SaveChanges() ist eine von zwei Techniken zum Speichern von Änderungen an der Datenbank mit EF. Mit dieser Methode führen Sie eine oder mehrere nachverfolgten Änderungen (Hinzufügen, Aktualisieren, Löschen) aus und wenden diese Änderungen dann durch Aufrufen der SaveChanges-Methode an. Alternativ können ExecuteUpdate und ExecuteDelete ohne Einbeziehung der Änderungsverfolgung verwendet werden. Einen einführenden Vergleich dieser beiden Techniken finden Sie auf der Übersichtsseite zum Speichern von Daten.

Tipp

Das in diesem Artikel verwendete Beispiel finden Sie auf GitHub.

Hinzufügen von Daten

Verwenden Sie die DbSet<TEntity>.Add-Methode, um Ihren Entitätsklassen neue Instanzen hinzuzufügen. Die Daten werden in die Datenbank eingefügt, wenn Sie DbContext.SaveChanges() aufrufen:

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://example.com" };
    context.Blogs.Add(blog);
    context.SaveChanges();
}

Tipp

Die MethodenAdd, Attach und Update wirken sich auf den vollständigen Graph an Entitäten aus, die an sie übergeben werden, wie im Abschnitt Relevante Daten beschrieben. Die Eigenschaft EntityEntry.State kann alternativ zum Festlegen des Zustands einer einzelnen Entität verwendet werden. Beispiel: context.Entry(blog).State = EntityState.Modified.

Aktualisieren von Daten

EF erkennt automatisch Änderungen an einer vorhandenen Entität, die nach dem Kontext nachverfolgt wird. Dazu gehören Entitäten, die Sie aus der Datenbank laden oder abfragen, und Entitäten, die vorher der Datenbank hinzugefügt und darin gespeichert wurden.

Ändern Sie einfach die Werte der Eigenschaften, und rufen Sie dann SaveChanges auf:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Single(b => b.Url == "http://example.com");
    blog.Url = "http://example.com/blog";
    context.SaveChanges();
}

Löschen von Daten

Verwenden Sie die DbSet<TEntity>.Remove-Methode, um Instanzen Ihrer Entitätsklassen zu löschen:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Single(b => b.Url == "http://example.com/blog");
    context.Blogs.Remove(blog);
    context.SaveChanges();
}

Wenn die Entität bereits in der Datenbank vorhanden ist, wird sie während des Aufrufs von SaveChanges gelöscht. Wenn die Entität noch nicht in der Datenbank gespeichert wurde (d.h. sie wird als „hinzugefügt“ nachverfolgt), wird sie aus dem Kontext entfernt und nicht mehr eingefügt, wenn SaveChanges aufgerufen wird.

Mehrere Vorgänge in einem Aufruf von SaveChanges

Sie können mehrere Vorgänge zum Hinzufügen, Aktualisieren und Entfernen in einem einzelnen Aufruf von SaveChanges kombinieren:

using (var context = new BloggingContext())
{
    // seeding database
    context.Blogs.Add(new Blog { Url = "http://example.com/blog" });
    context.Blogs.Add(new Blog { Url = "http://example.com/another_blog" });
    context.SaveChanges();
}

using (var context = new BloggingContext())
{
    // add
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_one" });
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_two" });

    // update
    var firstBlog = context.Blogs.First();
    firstBlog.Url = "";

    // remove
    var lastBlog = context.Blogs.OrderBy(e => e.BlogId).Last();
    context.Blogs.Remove(lastBlog);

    context.SaveChanges();
}

Hinweis

Bei den meisten Datenbankanbietern ist SaveChanges transaktional. Das bedeutet, dass alle Vorgänge entweder erfolgreich oder gar nicht abgeschlossen werden und niemals nur teilweise angewendet werden.