基本の SaveChanges

DbContext.SaveChanges() は、EF を使用してデータベースの変更を保存する 2 つの手法のうちの 1 つです。 このメソッドでは、1 つ以上の "追跡対象の変更" (追加、更新、削除) を実行して、SaveChanges メソッドを呼び出してそれらの変更を適用します。 もう 1 つの方法として、変更トラッカーなしで ExecuteUpdateExecuteDelete を使用することもできます。 これら 2 つの手法の紹介比較については、データの保存に関する概要ページを参照してください。

ヒント

この記事のサンプルは GitHub で確認できます。

データの追加

DbSet<TEntity>.Add メソッドを使用して、エンティティ クラスの新しいインスタンスを追加します。 DbContext.SaveChanges() を呼び出すと、データがデータベースに挿入されます。

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

ヒント

Add メソッド、Attach メソッド、Update メソッドはすべて、関連データに関するセクションで説明されているように、これらに渡されるエンティティのグラフ全体で動作します。 EntityEntry.State プロパティを使用して、単一のエンティティの状態を設定できます。 たとえば、「 context.Entry(blog).State = EntityState.Modified 」のように入力します。

データの更新

EF は、コンテキストによって追跡されている既存のエンティティに対して行われた変更を自動的に検出します。 これには、データベースから読み込む/クエリするエンティティと、既に追加され、データベースに保存されているエンティティが含まれます。

プロパティに割り当てられる値を変更し、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();
}

データの削除

DbSet<TEntity>.Remove メソッドを使用して、エンティティ クラスのインスタンスを削除します。

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

エンティティがデータベース内に既に存在する場合は、SaveChanges の処理中に削除されます。 エンティティがまだデータベースに保存されていない (追加時に追跡される) 場合は、コンテキストから削除され、SaveChanges が呼び出されてもエンティティが挿入されなくなります。

1 つの SaveChanges 内の複数の操作

複数の追加/更新/削除操作を組み合わせて、SaveChanges の 1 回の呼び出しで使用できます。

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

Note

ほとんどのデータベース プロバイダーでは、SaveChanges はトランザクションです。 そのため、すべての操作は成功または失敗のどちらかになり、操作の一部のみが適用されることはありません。