我有一个问题,我想分享。上下文有点混乱,所以我会尽力在解释中。
我需要在许多实体上创建一个事务操作。我正在使用EF CodeFirst但使用遗留数据库,我无法更改。为了创建比数据库提供的更一致的模型,我将数据库信息投射到我自己创建的更精细的实体中。
由于我需要使用不同的上下文,我最初的想法是使用TransactionScope,它在过去给了我很好的结果。为什么我需要不同的背景?由于db的各种问题,我无法仅在一个操作(UnitOfWork)中进行更新。我需要检索仅在SaveChanges()之后出现的不同ID。
using (var scope = new TransactionScope())
{
Operation1();
Operation2();
Operation3(uses ExecuteStoreCommand)
SaveChanges();
Operation4();
SaveChanges();
}
我知道,为了使用TransactionScope,我需要在所有操作之间共享相同的连接(我正在这样做,将上下文传递给对象)。但是,当我执行其中一个操作(使用ExecuteStoreCommand)或我尝试在第一个SaveChanges之后进行一些更新时,我总是收到 MSDTC错误(禁用对分布式事务的支持)或者更多很少见,因为卸载域。
我不知道是否有人可以帮助我,至少知道这是这个场景的最佳方向。
非常感谢,
答案 0 :(得分:7)
看看这个答案:
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();
}