コンテキスト クラスはデフォルトでトランザクションをサポートします。ただし、コンテキスト クラスの新しいインスタンスごとに、新しいトランザクションが作成されます。この新しいトランザクションはネストされたトランザクションであり、関連付けられたコンテキスト クラスで SaveChanges() が呼び出されるとコミットされます。
この場合、TransactionScope も必要ありません。両方の操作の結果を確認するだけで、成功した場合は SaveChanges() メソッドを呼び出すだけです。
TransactionScope は通常、ADO.NET 呼び出しと Entity フレームワークを混在させる場合に必要です。このような場合に TransactionScope を使用する秘訣は、独自のトランザクションで使用することをコンテキスト クラスに知らせることです。トランザクションはスコープ内の接続オブジェクトに関連付けられるため、トランザクション スコープに関連付けられている接続でコンテキスト クラスを使用する必要があります。また、呼び出し元のコードが接続を所有しているため、接続を所有できないことをコンテキスト クラスに知らせる必要があります。次のようなことができます。
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
using (var conn = new SqlConnection("..."))
{
conn.Open();
var sqlCommand = new SqlCommand();
sqlCommand.Connection = conn;
sqlCommand.CommandText =
@"UPDATE Blogs SET Rating = 5" +
" WHERE Name LIKE '%Entity Framework%'";
sqlCommand.ExecuteNonQuery();
using (var context =
new BloggingContext(conn, contextOwnsConnection: false))
{
var query = context.Posts.Where(p => p.Blog.Rating > 5);
foreach (var post in query)
{
post.Title += "[Cool Blog]";
}
context.SaveChanges();
}
}
scope.Complete();
}
参照: http://msdn.microsoft.com/en-us/data/dn456843.aspx