См. код ниже. Если я инициализирую более одного сущностного контекста, я получаю следующее исключение только в 2-м наборе кода. Если я прокомментирую второй набор, он работает.
{ "Исходный провайдер отказался при открытии." }
Внутренний: { "Не удалось связаться с основным менеджером транзакций".}
Внутренний: { "Ошибка HRESULT E_FAIL была возвращена из вызова COM-компонента".}
Обратите внимание, что это пример приложения, и я знаю, что нет смысла создавать 2 контекста подряд. Однако у производственного кода есть причина для создания нескольких контекстов в одном и том же TransactionScope
, и это не может быть изменено.
Edit
Вот предыдущий вопрос о том, как я пытаюсь настроить MS-DTC. Он кажется включенным как на сервере, так и на клиенте. Я не уверен, правильно ли он настроен. Также обратите внимание, что одна из причин, по которым я пытаюсь это сделать, заключается в том, что существующий код в TransactionScope
использует ADO.NET и Linq 2 Sql... Я бы хотел, чтобы они использовали ту же транзакцию. (Это, вероятно, звучит сумасшедшим, но мне нужно заставить его работать, если это возможно).
Как использовать TransactionScope в С#?
Решение
Брандмауэр 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();
}