Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 是否有任何理由将ObjectContext事务处理与DbContext';保存更改?_Entity Framework_Transactions_Dbcontext_Objectcontext - Fatal编程技术网

Entity framework 是否有任何理由将ObjectContext事务处理与DbContext';保存更改?

Entity framework 是否有任何理由将ObjectContext事务处理与DbContext';保存更改?,entity-framework,transactions,dbcontext,objectcontext,Entity Framework,Transactions,Dbcontext,Objectcontext,我有这样一个代码: public abstract class DataContextBase { public DbContext DbContext { get; protected internal set; } public ObjectContext ObjectContext { get; protected internal set; } protected DbTransaction transaction; protected void Set

我有这样一个代码:

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

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

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