Megosztás:


Alapszintű SaveChanges

DbContext.SaveChanges() az adatbázis módosításainak EF-vel történő mentésére szolgáló két módszer egyike. Ezzel a módszerrel egy vagy több korrektúrát hajt végre (hozzáadás, frissítés, törlés), majd alkalmazza ezeket a módosításokat a SaveChanges metódus meghívásával. Alternatív ExecuteUpdate megoldásként, és ExecuteDelete a változáskövető bevonása nélkül is használható. A két módszer bevezető összehasonlítása az adatok mentésének Áttekintés lapján található.

Jótanács

A cikk mintáját a GitHubon tekintheti meg.

Adatok hozzáadása

DbSet<TEntity>.Add A metódussal új példányokat adhat hozzá az entitásosztályokhoz. Az adatok a következő híváskor DbContext.SaveChanges()lesznek beszúrva az adatbázisba:

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

Jótanács

A Add, Attachés Update metódusok mind a nekik átadott entitások teljes gráfján működnek, a Kapcsolódó adatok szakaszban leírtak szerint. Másik lehetőségként az EntityEntry.State tulajdonság használható egyetlen entitás állapotának beállítására. Például: context.Entry(blog).State = EntityState.Modified.

Adatok frissítése

Az EF automatikusan észleli a környezet által nyomon követett meglévő entitás módosításait. Ide tartoznak az adatbázisból betöltendő/lekérdezett entitások, valamint az adatbázisba korábban felvett és mentett entitások.

Egyszerűen módosítsa a tulajdonságokhoz rendelt értékeket, majd hívja meg a következőt 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();
}

Adatok törlése

A metódussal DbSet<TEntity>.Remove törölheti az entitásosztályok példányait:

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

Ha az entitás már létezik az adatbázisban, akkor a folyamat során törölni fogják. Ha az entitást még nem mentették az adatbázisba (azaz hozzáadásként van nyomon követve), akkor eltávolítják a környezetből, és nem lesz többé beszúrva, amikor a SaveChanges meghívásra kerül.

Több művelet egyetlen SaveChanges-fájlban

Több hozzáadási/frissítési/eltávolítási műveletet egyesíthet egyetlen hívással: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();
}

Megjegyzés:

A legtöbb adatbázis-szolgáltató esetében a SaveChanges tranzakcióalag viselkedik. Ez azt jelenti, hogy az összes művelet sikeres vagy sikertelen, és a műveletek nem lesznek részlegesen alkalmazva.