Context 类默认支持事务。但是对于上下文类的每个新实例,都会创建一个新事务。这个新事务是一个嵌套事务,一旦关联上下文类上的 SaveChanges() 被调用,它将被提交。
在这种情况下,我们甚至不需要 TransactionScope。我们可以简单地检查两个操作的结果,如果它们成功,我们只需要调用 SaveChanges() 方法。
当我们将 ADO.NET 调用与实体框架混合时,通常需要 TransactionScope。在这种情况下使用 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