多个上下文实例上的EntityFramework事务

我试图了解如何使事务与我的项目一起工作.我将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
    }
}

有什么方法可以在企业中创建事务来管理工厂创建的所有上下文?除了在业务中创建上下文并将其传递给所有DaoFactories之外?

我找到了与TransactionScope有关的内容,但是从我看到的结果来看,它是针对SqlServer的.我试图手动打开连接和事务,但是上下文似乎重新打开了它们自己的上下文,因此我的回滚没有做任何事情.

编辑

如果可能,我不想在业务中包括对EF的引用.就像使用另一个工厂来打开和关闭交易

解决方法:

您可以通过打开自己的连接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();
    }
}

希望这可以帮助.

上一篇:春季:InvalidDataAccessApiUsageException?


下一篇:oracle11g 查询临时表空间的使用率和正在使用临时表空间的用户