Entity Framework команда Перехват изменение контекста строка подключения
Цель :
Возвращайтесь к резервной базе данных, когда основная база данных недоступна.
Текущая реализация :
При обнаружении проблемы используйте класс, реализующий IDbCommandInterceptor, Чтобы изменить строку подключения на резервный сервер.
- закрыть соединение в перехваченном контексте.
- изменить строку подключения.
- открытое соединение.
Это прекрасно работает с ReaderExecuting , но не делает с NonQueryExecuting . Я вижу, что соединение с резервным сервером открыто и выглядит нормально, но я получаю следующее в контексте .SaveChanges():
Базовый поставщик не смог выполнить коммит.
InnerException: Значение не может быть null. Имя параметра: connection
Обновление: Посмотрев немного подробнее на это, я вижу, что проблема происходит в транзакции, которая создается SaveChanges (). Закрытие соединение в контексте приводит к созданию исключения объектом транзакции при фиксации. Я не мог найти способ изменить соединение или строку соединения для этой транзакции. Утилизация его в Connectionetting () с помощью IDbTransactionInterceptor и создание новой транзакции в контексте не помогли, он все равно будет пытаться совершить коммит (вероятно, состояние гонки и не очень хороший способ сделать это в любом случае). ChangeDatabase () не будет работать, так как соединение должно быть одинаковым сервер.
Итак, теперь вопрос: Есть ли способ изменить соединение / строку соединения для существующей транзакции?
StackTrace:
at System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName)
at System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection connection)
at System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Commit(DbTransaction transaction, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityTransaction.Commit()