Entity Framework команда Перехват изменение контекста строка подключения


Цель :

Возвращайтесь к резервной базе данных, когда основная база данных недоступна.

Текущая реализация :

При обнаружении проблемы используйте класс, реализующий IDbCommandInterceptor, Чтобы изменить строку подключения на резервный сервер.

  1. закрыть соединение в перехваченном контексте.
  2. изменить строку подключения.
  3. открытое соединение.

Это прекрасно работает с 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()
1 2

1 ответ:

Правильное место для изменения строки соединения-это реализация Opening () интерфейса IDbConnectionInterceptor . Это работает для простых операций чтения, записи и транзакций. Реализациячленов IDbCommandInterceptor полезна для полного решения при работе с отдельными командами sql.