我使用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();
}
}
}
我没有收到错误当我使用单个dbContext时,上面的错误只有多个DbContext
答案 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。