質問: 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( "トランザクションの分離レベルのコミット読込みの設定"); これはうまくいきますが、開発者は通常、レプリケートされたデータベースでは動作しないため、不便でエラーが発生しやすくなります。
回答: それはあなたのonw Migratorを作成するのに役立つでしょうか? ``` internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { SetSqlGenerator("System.Data.SqlClient", new SqlMigrator()); } private class SqlMigrator : SqlServerMigrationSqlGenerator { public override IEnumerable Generate( IEnumerable 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; } } } ```