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);
    context.SaveChanges();
}

Conseil

Les méthodes Add, Attachet 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 = context.Blogs.Single(b => b.Url == "http://example.com");
    blog.Url = "http://example.com/blog";
    context.SaveChanges();
}

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 = context.Blogs.Single(b => b.Url == "http://example.com/blog");
    context.Blogs.Remove(blog);
    context.SaveChanges();
}

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" });
    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();
}

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.