c# - 無効 - entityframework migration 戻す




Entity FrameworkのCodeFirstマイグレーションの分離レベルを設定する方法 (2)

それはあなたのonw 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;
    }
  }
}

SQL Serverレプリケーション用に公開されたテーブルに対してエンティティフレームワークの移行(自動または明示的)を実行すると、次のエラーが発生します。

READPASTロックはREAD COMMITTEDまたはREPEATABLE READ分離レベルでのみ指定できます

Entity Frameworkの移行は、 Serializable分離レベル (SQL Serverプロファイラに明示されているように)で実行されます。

構造変更トランザクションの安全な選択ですが、公開されているSQL Serverテーブルとの互換性はありません。 dbContext.SaveChanges()トランザクションで使用されるデフォルトのREAD COMMITED SNAPSHOTレベルとは異なり、コード内の移行に別の分離レベルを実際に設定する方法はまだ見つかりませんでした。

  • TransactionScope分離レベルを設定するための従来の方法であるTransactionScopeは、 Database.Initialize()中に無視されるようです。

  • 最近導入されたDatabase.BeginTransaction(isolationLevel)実際には新しいトランザクションを開始する前にデータベースを初期化しようとするため、使用できません。

既知の回避策

  1. すべてのSQLスクリプトへの移行を生成します。 これは機能しますが、コードベースの移行は、私が逃したくない強力な手段です。

  2. 明示的な移行を使用し、それぞれのUp()およびDown()メソッドを次のように起動します

    Sql( "トランザクションの分離レベルのコミット読込みの設定");

これはうまくいきますが、開発者は通常、レプリケートされたデータベースでは動作しないため、不便でエラーが発生しやすくなります。


移行コードにSQLを記述して実行することができます。

SQL Server 2012で動的SQLを使用する前に:

public override void Up()
{
     Sql("DECLARE @SQL NVARCHAR(4000) = 'ALTER DATABASE '+ DB_NAME() +' SET ALLOW_SNAPSHOT_ISOLATION ON' ; EXEC sp_executeSql @SQL;", true);
}

SQL Server 2012以降の場合:

public override void Up()
{
     Sql("ALTER DATABASE CURRENT SET ALLOW_SNAPSHOT_ISOLATION ON",true);
}

「ALLOW_SNAPSHOT_ISOLATION」を分離レベルに変更します。





ef-migrations