Dela via


Grundläggande spara ändringar

DbContext.SaveChanges() är en av två metoder för att spara ändringar i databasen med EF. Med den här metoden utför du en eller flera spårade ändringar (lägg till, uppdatera, ta bort) och tillämpa ändringarna genom att anropa SaveChanges metoden. Som ett alternativ ExecuteUpdate och ExecuteDelete kan användas utan ändringsspåraren. En introduktionsjämförelse av dessa två tekniker finns på sidan Översikt om hur du sparar data.

Tips/Råd

Du kan visa den här artikelns exempel på GitHub.

Lägga till data

Använd metoden DbSet<TEntity>.Add för att lägga till nya instanser av dina entitetsklasser. Data infogas i databasen när du anropar DbContext.SaveChanges():

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

Tips/Råd

Metoderna Add, Attachoch Update fungerar alla i det fullständiga diagrammet över entiteter som skickas till dem, enligt beskrivningen i avsnittet Relaterade data . Alternativt kan egenskapen EntityEntry.State användas för att ange tillståndet för bara en enda entitet. Till exempel context.Entry(blog).State = EntityState.Modified.

Uppdatera data

EF identifierar automatiskt ändringar som gjorts i en befintlig entitet som spåras av kontexten. Detta omfattar entiteter som du läser in/frågar från databasen och entiteter som tidigare har lagts till och sparats i databasen.

Ändra bara de värden som tilldelats egenskaper och anropa SaveChangessedan :

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

Ta bort data

Använd metoden DbSet<TEntity>.Remove för att ta bort instanser av dina entitetsklasser:

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

Om entiteten redan finns i databasen tas den bort under SaveChanges. Om entiteten ännu inte har sparats i databasen (dvs. spåras som den har lagts till) tas den bort från kontexten och infogas inte längre när SaveChanges anropas.

Flera operationer i en enda "SaveChanges"

Du kan kombinera flera åtgärder för att lägga till/uppdatera/ta bort till ett enda anrop till 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();
}

Anmärkning

För de flesta databasprovidrar SaveChanges är transaktionell. Det innebär att alla åtgärder antingen lyckas eller misslyckas och att åtgärderna aldrig lämnas delvis tillämpade.