【发布时间】:2012-09-07 05:35:14
【问题描述】:
我有这样的代码:
public abstract class DataContextBase
{
public DbContext DbContext { get; protected internal set; }
public ObjectContext ObjectContext { get; protected internal set; }
protected DbTransaction transaction;
protected void SetContext(DbContext db, ObjectContext oc)
{
DbContext = db;
ObjectContext = oc;
}
public void BeginTransaction()
{
if (ObjectContext.Connection.State != System.Data.ConnectionState.Open)
{
ObjectContext.Connection.Open();
}
transaction = ObjectContext.Connection.BeginTransaction();
}
public void CommitTransaction()
{
try
{
transaction.Commit();
}
finally
{
transaction = null;
ObjectContext.Connection.Close();
}
}
public void RollbackTransaction()
{
try
{
transaction.Rollback();
}
finally
{
transaction = null;
ObjectContext.Connection.Close();
}
}
public void Save()
{
DbContext.SaveChanges();
}
}
它来自一个示例应用程序,我将它用作我的应用程序主数据上下文的基类。我正在使用 Entity Framework 5,我刚刚读到,当我调用 DbContext 的 SaveChanges 方法时,它始终在数据库事务中运行,并且在必须回滚事务时会抛出异常,在这种情况下,更改不是保存到数据库中。
但在示例应用程序中,几乎每个服务方法都以调用 DataContextBase.BeginTransaction 开始并以调用 DataContextBase.CommitTransaction 结束(在特殊情况下以 DataContextBase.RollbackTransaction 结束),即使调用了 DataContextBase.Save(其中调用 DbContext.SaveChanges())。
看起来有一个额外的事务包装了 DbContext.SaveChanges 调用的内置事务。
会不会有什么情况需要这个额外的交易?
注意:DataContextBase 的 ObjectContext 来自 DbContext 有一个技巧:
((IObjectContextAdapter)this).ObjectContext; // inside the DbContext class
【问题讨论】:
标签: entity-framework transactions dbcontext objectcontext