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

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

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

 Были вопросы об этом раньше ( [здесь](https://stackoverflow.com/questions/22789395/how-to-enable-codefirst-to-migrate-schema-changes-against-a-replicated-database) ), но они полностью не справляются с основной причиной: *миграция Entity Framework выполняется на уровне изоляции `Serializable`* (как это четко показано в профилировщике SQL Server). 

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

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

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

1. Сгенерировать все миграции в SQL-скрипт. Это работает, но переход на основе кода - это мощный инструмент, который я бы не хотел пропустить.
2. Используйте явные миграции и запустите каждый метод `Up()` и `Down()` с чем-то вроде 

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

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

 Помогло бы вам создать ваш onm Migrator? 

```
internal sealed class Configuration : DbMigrationsConfiguration<SupplierEntities>
{
  public Configuration()
  {
    SetSqlGenerator("System.Data.SqlClient", new SqlMigrator());
  }

  private class SqlMigrator : SqlServerMigrationSqlGenerator
  {
    public override IEnumerable<MigrationStatement> Generate(
      IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
    {
      yield return new MigrationStatement { Sql = "set transaction isolation level read committed" };
      foreach (var statement in base.Generate(migrationOperations, providerManifestToken))
        yield return statement;
    }
  }
}

```