将单元工作与存储过程相结合

时间:2017-04-13 06:14:21

标签: c# entity-framework ef-code-first

我已经在我的项目中实现了通用存储库模式以及工作单元。在dbcontext中提交更改的工作单元中只有一种方法。另外,我使用Code First Stored Prodecure库来访问存储过程。

我的工作单元代码如下所示:

public class UnitOfWork : IUnitOfWork
{
    private readonly MyDataContext _dbContext;

    public UnitOfWork()
    {
        _dbContext = new MyDataContext();
    }

    public int Save()
    {
        return _dbContext.SaveChanges();
    }
}

它按预期工作。但是,如果我想与实体框架一起访问存储过程,那么它会产生问题,因为存储过程和实体框架的事务将是不同的。

CodeFirstStoredProcedure库支持DbTransaction和Entity框架支持DbContextTransaction,它提供DbTransaction属性为

public DbTransaction UnderlyingTransaction { get; }

我想将我的UnitOfWork作为两种情况的事务处理程序。创建工作单元的对象时,应该开始EntityFramework的事务,并且应该将该事务对象传递给存储过程。这样两个框架共享公共事务对象。我尝试下面的代码:

public class UnitOfWork : IUnitOfWork, IDisposable, IDbTransaction
{
    private readonly MyDataContext _dbContext;

    public UnitOfWork()
    {
        _dbContext = new MyDataContext();
    }

    public IDbConnection Connection
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    public IsolationLevel IsolationLevel
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    public void Commit()
    {
        throw new NotImplementedException();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public void Rollback()
    {
        throw new NotImplementedException();
    }

    public int Save()
    {
        return _dbContext.SaveChanges();
    }
}

但我不知道如何将Dbtransaction对象传递给Entity Framework,以便我可以为工作单元创建新的DbTransaction实例,并将其存储为在Entity Framework和Stored procedures中使用的属性。

0 个答案:

没有答案