SaveChanges di base

DbContext.SaveChanges() è una delle due tecniche per salvare le modifiche apportate al database con Entity Framework. Con questo metodo, si eseguono una o più modifiche rilevate (aggiungere, aggiornare, eliminare) e quindi applicare tali modifiche chiamando il SaveChanges metodo . In alternativa, ExecuteUpdate e ExecuteDelete può essere usato senza coinvolgere lo strumento di rilevamento delle modifiche. Per un confronto introduttivo di queste due tecniche, vedere la pagina Panoramica sul salvataggio dei dati.

Suggerimento

È possibile visualizzare l'esempio di questo articolo in GitHub.

Aggiunta di dati

Usare il DbSet<TEntity>.Add metodo per aggiungere nuove istanze delle classi di entità. I dati verranno inseriti nel database quando si chiama DbContext.SaveChanges():

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

Suggerimento

I Addmetodi , Attache Update funzionano tutti sul grafico completo delle entità passate, come descritto nella sezione Dati correlati. In alternativa, è possibile usare la proprietà EntityEntry.State per impostare lo stato di una singola entità. Ad esempio, context.Entry(blog).State = EntityState.Modified.

Aggiornamento dei dati

Ef rileva automaticamente le modifiche apportate a un'entità esistente rilevata dal contesto. Sono incluse le entità caricate/sottoposte a query dal database e le entità aggiunte e salvate in precedenza nel database.

È sufficiente modificare i valori assegnati alle proprietà e quindi chiamare 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();
}

Eliminazione di dati

Usare il DbSet<TEntity>.Remove metodo per eliminare le istanze delle classi di entità:

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

Se l'entità esiste già nel database, verrà eliminata durante SaveChanges. Se l'entità non è ancora stata salvata nel database , ovvero viene rilevata come aggiunta, verrà rimossa dal contesto e non verrà più inserita quando SaveChanges viene chiamata.

Più operazioni in una singola chiamata a SaveChanges

È possibile combinare più operazioni di aggiunta/aggiornamento/rimozione in una singola chiamata a 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();
}

Nota

Per la maggior parte dei provider di database, SaveChanges è transazionale. Ciò significa che tutte le operazioni hanno esito positivo o negativo e le operazioni non vengono mai lasciate parzialmente applicate.