DbContext.SaveChanges() は、EF を使用してデータベースに対する変更を保存する 2 つの手法の 1 つです。 このメソッドでは、1 つ以上の 変更履歴 (追加、更新、削除) を実行し、 SaveChanges
メソッドを呼び出してそれらの変更を適用します。 別の方法として、 ExecuteUpdate と ExecuteDelete は、変更トラッカーを使用せずに使用できます。 これら 2 つの手法の紹介比較については、データの保存に関する概要ページを参照してください。
ヒント
この記事の サンプル は、GitHub で確認できます。
データの追加
DbSet<TEntity>.Add メソッドを使用して、エンティティ クラスの新しいインスタンスを追加します。 DbContext.SaveChanges()を呼び出すと、データがデータベースに挿入されます。
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
}
ヒント
Add
、Attach
、およびUpdate
メソッドはすべて、「関連データ」セクションで説明されているように、渡されたエンティティの完全なグラフで動作します。 または、EntityEntry.State プロパティを使用して、単一のエンティティの状態を設定することもできます。 たとえば、context.Entry(blog).State = EntityState.Modified
のようにします。
データの更新
EF は、コンテキストによって追跡される既存のエンティティに加えられた変更を自動的に検出します。 これには、データベースから読み込み/クエリを実行したエンティティと、以前にデータベースに追加および保存されたエンティティが含まれます。
プロパティに割り当てられた値を変更し、 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();
}
データの削除
エンティティ クラスのインスタンスを削除するには、 DbSet<TEntity>.Remove メソッドを使用します。
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();
}
エンティティがデータベースに既に存在する場合は、 SaveChanges
中に削除されます。 エンティティがまだデータベースに保存されていない場合 (つまり、追加された状態で追跡されます)、エンティティはコンテキストから削除され、 SaveChanges
が呼び出されたときに挿入されなくなります。
1 つの SaveChanges での複数の操作
複数の追加/更新/削除操作を 1 回の呼び出しに組み合わせて 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();
}
注
ほとんどのデータベース プロバイダーでは、 SaveChanges
はトランザクションです。 つまり、すべての操作が成功または失敗し、操作が部分的に適用されることはありません。
.NET