См. Код ниже. Если я инициализирую более одного контекста объекта, я получаю следующее исключение только для 2-го набора кода. Если я закомментирую второй набор, он работает.
{"Базовый провайдер не удалось открыть."}
Внутренний: {"Связь с базовым диспетчером транзакций не удалась."}
Внутренний: {"Ошибка HRESULT E_FAIL была возвращена из вызова компонента COM."}
Обратите внимание, что это пример приложения, и я знаю, что создавать два контекста подряд не имеет смысла. Однако в производственном коде есть причина для создания нескольких контекстов в одном TransactionScope, и это нельзя изменить.
Изменить
Вот предыдущий вопрос о том, как я пытался настроить MS-DTC. Кажется, что он включен и на сервере, и на клиенте. Я не уверен, правильно ли он настроен. Также обратите внимание, что одна из причин, по которой я пытаюсь это сделать, заключается в том, что существующий код в TransactionScope использует ADO.NET и Linq 2 Sql ... Я бы хотел, чтобы они также использовали ту же транзакцию. (Возможно, это звучит безумно, но мне нужно, чтобы это работало, если возможно).
Как использовать TransactionScope в C #?
Решение
Брандмауэр Windows блокировал подключения к MS-DTC.
using(TransactionScope ts = new System.Transactions.TransactionScope())
{
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
var v = (from s in o.Advertiser select s).First();
v.AcceptableLength = 1;
o.SaveChanges();
}
//-> By commenting out this section, it works
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
//Exception on this next line
var v = (from s1 in o.Advertiser select s1).First(); v.AcceptableLength = 1;
o.SaveChanges();
}
//->
ts.Complete();
}