我已经在我的项目中实现了通用存储库模式以及工作单元。在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中使用的属性。