Транзакция для двух разных объектов в Entity Framework 4 - PullRequest
1 голос
/ 26 июля 2011

У меня есть две разные сущности разных баз данных. В моем процессе я хочу манипулировать обеими базами данных, и весь процесс должен быть в транзакции. Я пытался с TransactionScope. Это прекрасно работает для одного лица.

var entity1 = clsProject.GetEntity1();
var entity2 = clsProject.GetEntity2();
System.Transactions.TransactionScope tranScope = new System.Transactions.TransactionScope();
entity1.Connection.Open();
entity2.Connection.Open();

//Do operations
entity1.SaveChanges(false);
entity2.SaveChanges(false);
tranScope.Complete();
entity1.AcceptAllChanges();
entity2.AcceptAllChanges();

Но в этой строке возникает ошибка: entity2.Connection.Open (); Сообщение об ошибке: сбой основного поставщика Внутреннее исключение: менеджер транзакций партнера отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D025)

Пожалуйста, дайте ваши идеи для этого.

Заранее спасибо,

Нареш Горадара

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Если вторая база данных находится на другом сервере, вам нужно включить Координатор распределенных транзакций на обоих серверах, и TransactionScope будет работать.

1 голос
/ 26 июля 2011

Как указывалось ранее, вам нужно включить координатора распределенных транзакций, но вам также необходимо настроить его для разрешения входящих и / или исходящих соединений.

Кроме того: для целей тестирования вы можете настроить его на отсутствие аутентификации.

Все эти параметры доступны на вкладке «Безопасность» «Координатора распределенных транзакций» в MMC «Службы компонентов».

Все это можно найти по ссылке, предоставленной «Евгением С.»: Координатор распределенных транзакций

Еще один момент, на который следует обратить внимание: у Microsoft есть инструмент для тестирования DTC, известный как DTCPing . Вы можете извлечь этот инструмент на оба сервера, которые должны быть вовлечены в транзакцию, запустить программы на каждом сервере одновременно и указать имя «партнера по транзакции» (это просто имя другого компьютера). Нажмите кнопку «Выполнить» на каждом сервере, и инструмент выполнит для вас несколько тестов - у него также есть несколько хороших отчетов об ошибках.

...