У меня есть методы уровня обслуживания, которые вносят несколько изменений в базу данных, и я хочу, чтобы они использовали управление транзакциями. Такие методы могут сделать следующее:
- LINQ SubmitChanges () функциональность
- Звонки в StoredProcedures
Пользователи компонентов могут объединять множество таких элементарных операций в нечто большее.
Я вижу, что есть хороший класс TransactinScope и пытаюсь его использовать:
using (TransactionScope transaction = new TransactionScope())
{
content = repository.CreateBaseContent(content);
result = repository.CreateTreeRelation(content, parent.Id, name);
transaction.Complete();
}
public baseContent CreateBaseContent(baseContent content)
{
EntityContext.baseContents.InsertOnSubmit(content);
EntityContext.SubmitChanges();
return content;
}
public CreateTreeRelation (params)
{
// do StoredProcedure call here via LINQ
}
Мое предположение состояло в том, что на внешних слоях можно было бы добавить еще один уровень объема транзакции. Вместо этого у меня появляется следующая ошибка:
Менеджер транзакций отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D024)
Я использую ту же (Vista Ultimate) машину для MS SQL 2005 и сервера разработки Microsoft. Из юнит-тестов все отлично работает. То же самое, когда прокомментировал TransactionScope.
Я пытался играть с безопасностью для DTC (http://support.microsoft.com/kb/899191), и когда я настроил прием всех входящих и исходящих транзакций, у меня появляется следующее сообщение об ошибке:
Ошибка HRESULT E_FAIL возвращена после вызова COM-компонента.
Во время отладки я обнаружил, что в SubmitChanges контекст сущности Linq имеет свойство Transaction IS NULL (!!), а System.Transactions.Transaction.Current имеет открытую транзакцию