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