Подавление зачисления TransactionScope только для чтения контекста EF?

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

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

2 ответа

Решение

Я смотрел на аналогичную проблему с Linq для Sql - изначально наше решение заключается в том, чтобы использовать то же соединение для каждого запроса. Рик Страл написал серию постов в блоге, на которые стоило посмотреть.

В нашем решении конструктор (и) DataContext имеют перегруженный конструктор, который извлекает соединение из фабрики (если соединение не существует, переданное соединение сохраняется в потоке)

public DataContext1(connection)
    : base (ConnectionFactory.GetConnectionFromContext(connection))
{
}

Кажется, что это нормально работает в сценарии WCF, фабрика соединений может сохранять / извлекать из коллекции ServiceModel.OperationContext.Items и (что более важно) подписываться на событие OperationComplete, чтобы закрыть / удалить соединение в потоке при выполнении всех операций. сделано.

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

Сейчас я смотрю на сценарии, не относящиеся к WCF... ТБХ, это не красиво. У нас также нет триггера события OperationCompleted, который есть в контексте WCF.

Я не уверен, будет ли это включать второе соединение в транзакцию, но вы можете попытаться подавить транзакцию по своему выбору:

using (new TransactionScope(TransactionScopeOption.Suppress))
{}
Другие вопросы по тегам