2012-09-07 26 views
0

我有这样的代码:是否有任何理由使用ObjectContext事务处理与DbContext的SaveChanges?

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(); 
    } 
} 

它是从一个示例应用程序,我用这个作为一个基类我的应用程序的主数据上下文的。我正在使用实体框架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 

回答

1

有一个额外的交易是多余的,因为ObjectContext/DbContext实现了工作单位。如果您有其他方式与数据库进行通信,并且他们还需要成为交易的一部分,请使用TransactionScope

连接管理也由EF完成,您不必

相关问题