3

我试图了解如何使交易与我的项目一起工作。我将 EntityFramework 4 与 Oracle 11g 数据库一起使用。

在这里他的交易,我有很多操作要做,并且我想在抛出意外异常时回滚。我有多个具有简单操作的类,每个类都创建自己的上下文并进行一些更改,例如:

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 的引用。就像使用另一个工厂打开和关闭事务一样

4

1 回答 1

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();
    }
}

希望这可以帮助。

于 2012-08-21T10:32:51.843 回答