Переработка вложенных подключений EF, чтобы избежать MSDTC в Azure.

Я выполнил развертывание в Azure и Azure SQL, который не поддерживает MSDTC, и у меня возникли проблемы с пониманием того, как переработать мой код, чтобы предотвратить то, что я полагаю, является вложенными подключениями. Я новичок в EF, и мои знания TransactionScope невелики, поэтому я не уверен, что у меня правильный шаблон.

Я пытаюсь использовать репозитории, которые вызывают общий экземпляр ObjectContext (я пытался использовать EndRequest, но возникли проблемы, так что это еще одна проблема для меня).

У меня есть транзакция, которая несколько раз вызывает SaveChanges для экземпляра ObjectContext, но в какой-то момент она становится удаленной. Что управляет этим, и можете ли вы порекомендовать, что я могу сделать, чтобы он работал правильно?


person Savage    schedule 19.12.2012    source источник


Ответы (1)


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

using (var context = new YourObjectContext()) {
    context.Connection.Open();

    ...
}

Я пытаюсь использовать репозитории, которые вызывают общий экземпляр ObjectContext (я пытался использовать EndRequest, но возникли проблемы, так что это еще одна проблема для меня).

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

person Ladislav Mrnka    schedule 20.12.2012
comment
Сколько раз вам разрешено вызывать SaveChanges для каждого экземпляра ObjectContext? - person Savage; 20.12.2012
comment
Проблема заключалась в том, что я использовал более одного блока using{} в одной и той же транзакции. Я удалил все свои блоки using{}, использовал общий экземпляр, а затем удалял экземпляр в конце каждого запроса. - person Savage; 21.12.2012