Вызов Entity Framework из метода NServiceBus вызывает ошибку - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть решение, в котором есть собственная служба WCF. Этот сервис подключается к EF и может нормально читать и писать.

В том же решении я также размещаю конечную точку NServiceBus. Он получает событие из отдельного работающего решения.

Когда я запускаю проект NServiceBus (сам по себе), он, кажется, работает нормально, пока я не попытаюсь выполнить запрос к своей базе данных. Когда я делаю это, я получаю это EntityException:

Основной поставщик не удалось открыть.

Внутренним исключением является TransactionException с сообщением:

Менеджер транзакций партнера отключил поддержку удаленных / сетевых транзакций

В моих проектах NServiceBus и WCF Service используются точно такие же конфигурации и в проектах EF. Я не понимаю, почему один терпит неудачу, а другой нет.

Я немного погуглил и наткнулся на эту страницу: http://msdn.microsoft.com/en-us/library/aa561924%28BTS.20%29.aspx, которая показала мне, как настроить MSDTC, и я сделал это на своем клиентском компьютере. Но это не имело никакого эффекта.

Я также нашел этот вопрос, который говорит, что его нужно задать: NServiceBus: System.Transactions.TransactionException: Менеджер транзакций партнера отключил свою поддержку удаленных / сетевых транзакций . Но это не говорит, почему или где.

Нужно ли устанавливать MSDTC на моем сервере БД? Если так, то почему? Что такое MSDTC?

Почему запуск из размещенного процесса NServiceBus вызывает эту ошибку?

ОБНОВЛЕНИЕ : Я нашел эту ссылку , которая помогла мне понять, что делает DTC. Он также показал мне, как отключить его при необходимости:

using (TransactionScope sc=new TransactionScope(TransactionScopeOption.Suppress))
     YourDatabaseHandler.SaveMyStuff(whatever);

Хотя, похоже, это хорошо во многих ситуациях.

1 Ответ

6 голосов
/ 11 ноября 2011

Поскольку NSB использует транзакционную очередь, вы собираетесь участвовать в распределенной транзакции. Это означает, что каждый участвующий компьютер должен будет голосовать, завершать ли транзакцию или нет. Это делается через координатора распределенных транзакций (MSDTC). Это должно быть запущено на обеих машинах (и если вы используете другие БД, такие как Oracle, есть дополнительная служба). Для управления MSDTC перейдите в Службы компонентов -> Компьютеры -> Мой компьютер -> Координатор распределенных транзакций -> Локальный DTC. Щелкнув правой кнопкой мыши по этому узлу, вы найдете всю конфигурацию, включая безопасность.

...