无法修复MSDTC错误

时间:2017-02-01 14:25:53

标签: c# entity-framework ef-code-first transactionscope

我使用TransactionScope维护2个数据库之间的事务。我使用2个不同的DbContext创建了2个数据库但我第二次得到错误 SaveChanges()方法调用。我已经启动了MSDTC(分布式事务协调器)&依赖服务但仍然出错。

using (var transaction = new TransactionScope(TransactionScopeOption.Required))
        {
            using (var employeeContext = new EmployeeDbContext())
            {
                var newEmployee = new Employee { Id = 1, Name = "Pankaj" };
                employeeContext.Employee.Add(newEmployee);
                using (var orderContext = new OrderDbContext())
                {
                    var newOrder = new Order { EmployeeId = 1, OrderId = 1, OrdreName = "Test", Amount = 100 };
                    orderContext.Order.Add(newOrder);

                    employeeContext.SaveChanges();
                    orderContext.SaveChanges();//getting error here
                    transaction.Complete();
                }
            }

        }

Error

我没有收到错误当我使用单个dbContext时,上面的错误只有多个DbContext

1 个答案:

答案 0 :(得分:0)

不知道您是否仍在寻找解决方案 - 但是如果:您是否曾尝试更改MS DTC设置?也许你不“允许远程客户端”。如果您在搜索字段中输入dcomcnfg(在windows =>开始),则可以进行此类设置。之后,组件服务应该打开。之后,您转到组件服务=>计算机=>我的电脑=>分布式事务协调器=> [Your_DTC]。在DTC,您可以打开一个属性页面,您可以在其中更改(例如)安全设置。选中“允许远程客户端”可能会解决您的问题。如果没有,请尝试其他设置..

我建议使用stackoverflow问题:MSSQL Error 'The underlying provider failed on Open'How to run two Entity Framework Contexts inside TransactionScope without MSDTC?

你说过:

  

我没有收到错误当我使用单个dbContext时,上面的错误只有多个DbContext

此行为的原因非常明确:TransactionScope可帮助您处理事务。 Microsoft提供默认的两个事务管理器:用于“简单”事务的LTM(轻量级事务管理器)和用于分布式事务的DTC。如果交易符合某些标准,MS会自动将交易升级为DTC。一个标准是两个不同数据库上的事务访问。因此,如果您想“解决”您的问题,并且如果可能,您可以尝试在一个事务中避免多个数据库访问。由于此修改,您的交易将不再升级到MS DTC。