gpt4 book ai didi

c# - 多个上下文实例化上的 EntityFramework 事务

转载 作者:行者123 更新时间:2023-11-30 16:22:58 24 4
gpt4 key购买 nike

我试图了解如何让交易与我的项目一起工作。我将 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 的引用。就像使用另一个工厂打开和关闭事务

最佳答案

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

希望这对您有所帮助。

关于c# - 多个上下文实例化上的 EntityFramework 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12052672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com