Entity framework 是否有必要在工作5中管理事务?(多个上下文)

Entity framework 是否有必要在工作5中管理事务?(多个上下文),entity-framework,transactions,Entity Framework,Transactions,在一个自定义工作单元内可能存在多个DBContext的情况下,EF5是否会管理所有事务性需求,或者下面的代码是否仍然有效/必需?如果没有,代码可以减少多少,并且仍然提供相同的功能 public void SaveAllChanges() { var transactions = new List<DbTransaction>(); foreach (var context in this.contexts .Where(context => c

在一个自定义工作单元内可能存在多个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();
        }
    }
}
public void SaveAllChanges()
{
var事务=新列表();
foreach(在this.context中为var context
.Where(context=>context!=null)
.Select(dbcontext=>((IObjectContextAdapter)dbcontext.ObjectContext))
{
context.Connection.Open();
var databaseTransaction=context.Connection.BeginTransaction();
事务。添加(数据库事务);
尝试
{
SaveChanges();
}
抓住
{
foreach(交易中的var交易)
{
尝试
{
transaction.Rollback();
}
最后
{
databaseTransaction.Dispose();
}
}
transactions.Clear();
投掷;
}
}
尝试
{
foreach(交易中的var交易)
{
Commit();
}
}
最后
{
foreach(交易中的var交易)
{
transaction.Dispose();
}
transactions.Clear();
foreach(在this.context中为var context
.Select(dbcontext=>((IObjectContextAdapter)dbcontext).ObjectContext)
.Where(context=>context.Connection.State!=ConnectionState.Closed))
{
context.Connection.Close();
}
}
}

假设SQL Server 2008及更高版本。

在处理多个上下文时,您必须自己处理事务,但您的代码是错误的。如果您的任何事务在提交期间失败,则可以提交部分事务并回滚部分事务

唯一有效的方法是使用
TransactionScope
,手动或实时处理分布式事务:

var objectContexts = this.contexts
                         .Where(context => context != null)
                         .Select(dbcontext => ((IObjectContextAdapter)dbcontext).ObjectContext))
                         .ToArray();

var transactionOptions = new TransactionOptions { 
    IsolationLevel = IsolationLevel.ReadCommitted 
};
using (var scope = new TransactionScope(TransactionScopeOption.Required,
                                        transactionOptions)) {
   Array.ForEach(objectContext, 
                 o => o.SaveChanges(SaveOptions.DetectChangesBeforeSave));
   scope.Complete();
}

Array.ForEach(objectContext, o => o.AcceptAllChanges());

说明了可接受更改的重要性。

是否有什么东西让您相信这方面发生了更改?没有,但我读到的是DbContext SaveChanges被包装在事务中,因此我想知道上述内容是否完全必要。谢谢。这段代码可以追溯到很久以前。这个信息真的很有用。