Partager via


SaveChanges de base

DbContext.SaveChanges() est l’une des deux techniques permettant d’enregistrer les modifications apportées à la base de données avec EF. Avec cette méthode, vous effectuez une ou plusieurs modifications suivies (ajouter, mettre à jour, supprimer), puis appliquer ces modifications en appelant la SaveChanges méthode. En guise d’alternative, ExecuteUpdate et ExecuteDelete peut être utilisé 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 / Astuce

Vous pouvez afficher l’exemple de cet article sur GitHub.

Ajout de données

Utilisez la DbSet<TEntity>.Add méthode 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 / Astuce

Les méthodes Add, Attach et Update fonctionnent toutes sur le graphe complet des entités qui leur sont passées, comme décrit dans la section Données associées. Vous pouvez également 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/interrogez à partir de la base de données, ainsi que les 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 DbSet<TEntity>.Remove méthode 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ée), elle sera supprimée du contexte et ne sera plus insérée lorsque SaveChanges est appelé.

Opérations multiples 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.