Entity framework 是否有必要在工作5中管理事务?(多个上下文)
在一个自定义工作单元内可能存在多个DBContext的情况下,EF5是否会管理所有事务性需求,或者下面的代码是否仍然有效/必需?如果没有,代码可以减少多少,并且仍然提供相同的功能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
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被包装在事务中,因此我想知道上述内容是否完全必要。谢谢。这段代码可以追溯到很久以前。这个信息真的很有用。