カスタム作業単位内に複数のDbContextが存在する可能性がある場合、EF5はすべてのトランザクション要件を管理しますか、それとも以下のコードは引き続き有効/必須ですか?そうでない場合、コードをどこまで削減しても同じ機能を提供できますか?
public void SaveAllChanges()
{
var transactions = new List<DbTransaction>();
foreach (var context in this.contexts
.Where(context => context != null)
.Select(dbcontext => ((IObjectContextAdapter)dbcontext).ObjectContext))
{
context.Connection.Open();
var databaseTransaction = context.Connection.BeginTransaction();
transactions.Add(databaseTransaction);
try
{
context.SaveChanges();
}
catch
{
foreach (var transaction in transactions)
{
try
{
transaction.Rollback();
}
finally
{
databaseTransaction.Dispose();
}
}
transactions.Clear();
throw;
}
}
try
{
foreach (var transaction in transactions)
{
transaction.Commit();
}
}
finally
{
foreach (var transaction in transactions)
{
transaction.Dispose();
}
transactions.Clear();
foreach (var context in this.contexts
.Select(dbcontext => ((IObjectContextAdapter)dbcontext).ObjectContext)
.Where(context => context.Connection.State != ConnectionState.Closed))
{
context.Connection.Close();
}
}
}
SQLServer2008以降を想定します。