gpt4 book ai didi

c#-4.0 - 使用SaveChanges和ExecuteStoreCommand的事务性操作

转载 作者:行者123 更新时间:2023-12-04 18:12:58 25 4
gpt4 key购买 nike

我有一个要分享的问题。上下文有点困惑,因此我将尽力在解释中尽力而为。
我需要在多个实体上创建事务性操作。我正在使用EF CodeFirst,但是正在使用无法更改的旧数据库。为了创建比数据库更一致的模型,我将数据库信息投影到我自己创建的更精细的实体中。
由于我需要使用不同的上下文,因此我最初的想法是使用TransactionScope,这在过去给了我很好的效果。为什么我需要不同的环境?由于db的各种问题,我无法仅通过一项操作(UnitOfWork)进行更新。我需要检索仅在SaveChanges()之后出现的其他ID。

using (var scope = new TransactionScope())
{
Operation1();
Operation2();
Operation3(uses ExecuteStoreCommand)
SaveChanges();

Operation4();
SaveChanges();
}
我知道,为了使用TransactionScope,我需要在所有操作之间共享相同的连接(我正在这样做,将上下文传递给对象)。但是,当我执行其中一个操作(使用ExecuteStoreCommand)或尝试在第一个SaveChanges之后进行一些更新时,我总是收到 MSDTC错误(禁用了对分布式事务的支持),甚至更罕见,因为 已卸载域
我不知道是否有人可以帮助我,至少不知道哪种方法是此方案的最佳方向。

最佳答案

看一下这个答案:
Entity Framework - Using Transactions or SaveChanges(false) and AcceptAllChanges()?
答案恰好满足您在多个数据上下文中进行事务的要求。

我发现有关Transactions and Connections in Entity Framework 4.0的帖子也非常有帮助。

对于可能需要更简单解决方案的人,这是在需要在事务中混合使用ExecuteStoreCommand和SaveChanges时使用的方法。

using (var dataContext = new ContextEntities())
{
dataContext.Connection.Open();
var trx = dataContext.Connection.BeginTransaction();

var sql = "DELETE TestTable WHERE SomeCondition";
dataContext.ExecuteStoreCommand(sql);

var list = CreateMyListOfObjects(); // this could throw an exception
foreach (var obj in list)
dataContext.TestTable.AddObject(obj);
dataContext.SaveChanges(); // this could throw an exception

trx.Commit();
}

关于c#-4.0 - 使用SaveChanges和ExecuteStoreCommand的事务性操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411948/

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