SaveChanges de base
DbContext.SaveChanges() est l’une des deux techniques d’enregistrement des modifications apportées à la base de données avec EF. Avec cette méthode, vous effectuez un ou plusieurs suivi des modifications (ajouter, mettre à jour, supprimer), puis appliquer ces modifications en appelant la méthode SaveChanges
. En guise d’alternative, ExecuteUpdate et ExecuteDelete peuvent être utilisés sans impliquer le suivi des modifications. Pour une comparaison de ces deux techniques, consultez la page vue d’ensemble sur l’enregistrement des données.
Conseil
Vous pouvez afficher cet exemple sur GitHub.
Ajout de données
Utilisez la méthode DbSet<TEntity>.Add pour ajouter de nouvelles instances de vos classes d’entité. Les données sont insérées dans la base de données lorsque vous appelez DbContext.SaveChanges():
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
}
Conseil
Les méthodes Add
, Attach
et Update
fonctionnent toutes sur le graphique complet des entités passées, comme décrit dans la section Données associées. Vous pouvez aussi utiliser la propriété EntityEntry.State pour définir l’état d’une seule entité. Par exemple, context.Entry(blog).State = EntityState.Modified
Mise à jour des données
EF détecte automatiquement les modifications apportées à une entité existante qui est suivie par le contexte. Cela inclut les entités que vous chargez/demandez à partir de la base de données et des entités qui ont été précédemment ajoutées et enregistrées dans la base de données.
Modifiez simplement les valeurs affectées aux propriétés, puis appelez SaveChanges
:
using (var context = new BloggingContext())
{
var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com");
blog.Url = "http://example.com/blog";
await context.SaveChangesAsync();
}
Suppression de données
Utilisez la méthode DbSet<TEntity>.Remove pour supprimer des instances de vos classes d’entité :
using (var context = new BloggingContext())
{
var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com/blog");
context.Blogs.Remove(blog);
await context.SaveChangesAsync();
}
Si l’entité existe déjà dans la base de données, elle est supprimée pendant SaveChanges
. Si l’entité n’a pas encore été enregistrée dans la base de données (autrement dit, elle est suivie comme ajouté), elle sera supprimée du contexte et ne sera plus insérée lorsque SaveChanges
est appelée.
Plusieurs opérations dans un seul SaveChanges
Vous pouvez combiner plusieurs opérations Add/Update/Remove en un seul appel à SaveChanges
:
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" });
await context.SaveChangesAsync();
}
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 = await context.Blogs.FirstAsync();
firstBlog.Url = "";
// remove
var lastBlog = await context.Blogs.OrderBy(e => e.BlogId).LastAsync();
context.Blogs.Remove(lastBlog);
await context.SaveChangesAsync();
}
Remarque
Pour la plupart des fournisseurs de base de données, SaveChanges
est transactionnel. Cela signifie que toutes les opérations réussissent ou échouent et que les opérations ne sont jamais partiellement appliquées.