Подавление зачисления 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))
{}