我试图了解如何使交易与我的项目一起工作。我将EntityFramework 4与Oracle 11g数据库一起使用。
这是他的交易,我有很多操作要做,我想在抛出意外异常时回滚。我有多个带简单操作的类,每个类创建它自己的Context并进行一些更改,例如:
public class OneDaoFactory
{
public int AddTreatment(Dto dto)
{
using (Context bdd = new Context())
{
//Make some changes in database
bdd.SaveChanges();
}
}
}
现在我有业务,他将从工厂调用方法:
public void Business()
{
try
{
OneDaoFactory.AddTreatment(dto);
SecondDaoFactory.Add(dto2);
throw new Exception("make a rollback");
}
catch(Exception ex)
{
//rollback
}
}
有没有办法在业务中创建一个管理工厂创建的所有上下文的事务?除了在业务中创建一个Context并将其传递给所有DaoFactories?
我找到了TransactionScope
的内容,但从我看到的内容来看,它适用于SqlServer。我试图手动打开一个连接和一个事务,但上下文似乎重新打开了他们的所有权,所以我的回滚什么也没做。
修改
如果可能,我不想在业务中包含对EF的引用。就像使用另一个工厂来打开和关闭交易一样
答案 0 :(得分:3)
您可以通过打开自己的连接EntityConnection
来执行此操作,然后打开一个事务并将连接传递给对象上下文:
public class OneDaoFactory
{
private EntityConnection conn; // initialize from outside
//...
public int AddTreatment(Dto dto)
{
using (Context bdd = new Context(conn))
{
//Make some changes in database
bdd.SaveChanges();
}
}
}
public void Business()
{
EntityConnection conn = new EntityConnection(ConnectionString);
OneDaoFactory.SetConnection( conn );
SecondDaoFactory.SetConnection( conn );
using( var ts = new TransactionScope())
{
OneDaoFactory.AddTreatment(dto);
SecondDaoFactory.Add(dto2);
throw new Exception("make a rollback);
ts.Complete();
}
}
希望这有帮助。