【问题标题】:Is there any reason to use ObjectContext transaction handling with DbContext's SaveChanges?是否有任何理由将 ObjectContext 事务处理与 DbContext 的 SaveChanges 一起使用?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多