多个上下文实例的EntityFramework事务

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
    }
}

有没有办法在业务中创建一个事务,以管理工厂创建的所有上下文?除了在业务中创建一个Context并将其传递给所有DaoFactories之外?我发现了有关TransactionScope的东西,但是从我看到的来看,它只用于SqlServer。我尝试手动打开连接和事务,但上下文似乎重新打开自己,所以我的回滚无效。如果可能,我希望在业务中不包含对EF的引用。像使用另一个工厂来打开和关闭事务。

默认情况下,如果在TransactionScope内打开连接,则该连接将被注册到环境事务中。 - Pawel
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();
    }
}

希望这有所帮助。

有趣的是,我本来不想在我的业务中包含对实体的引用,但看起来我不得不这样做。 - wishper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接