Как установить уровень изоляции для Entity Framework CodeFirst Migrations

Если вы запустите миграцию структуры сущностей (автоматическую или явную) для таблиц, опубликованных для репликации SQL Server, вы получите следующую ошибку:

Вы можете указать блокировку READPAST только в уровнях изоляции READ COMMITTED или REPEATABLE READ

Были вопросы по этому поводу раньше (Вот), но они полностью не в состоянии устранить основную причину:Миграция Entity Framework выполняется наSerializable уровень изоляции (как ясно показано в профилировщике SQL Server).

Который является безопасным выбором для транзакции с изменением структуры, но он просто не совместим с опубликованными таблицами SQL Server. В отличие от уровня READ COMMITED SNAPSHOT по умолчанию, используемого вdbContext.SaveChanges() транзакции, я еще не нашел способ фактически установить другой уровень изоляции для миграций в коде:

TransactionScope (классический способ установить уровень изоляции для транзакций), кажется, игнорируется во времяDatabase.Initialize()

Недавно введенныйDatabase.BeginTransaction(isolationLevel) фактически пытается инициализировать базу данных перед началом новой транзакции, поэтому не может быть использована.

Известные обходные пути

Генерация всех миграций в сценарий SQL. Это работает, но миграции на основе кода являются мощным инструментом, который я не хотел бы упустить.

Используйте явные миграции и начните каждыйUp() а такжеDown() метод с чем-то вроде

Sql («установить уровень изоляции транзакции для чтения зафиксирован»);

Это работает, но неудобно и подвержено ошибкам, так как разработчики обычно не работают с реплицированной базой данных.

Ответы на вопрос(2)

Ваш ответ на вопрос