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.