エンティティ フレームワーク (5) のモジュラー実装を構築しており、モジュラー マイグレーションを実装しようとしています。
アイデアは、各モジュールが DbMigration のインスタンスである移行を登録できるということです (移行を登録するために EF が既に使用しているもの)。この概念を使用して、
データベースを何度も移行するつもりですApplication_StartModules_Loaded
Database.SetInitializer<YourContext>(
new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
モジュールによって登録されたすべての DbMigrations を に渡す方法はありますMigrateDatabaseToLatestVersionか?
リサーチ
最初は MigrateDatabaseToLatestVersion をサブクラス化する必要があると思っていましたが、ソースを調べた後、拡張性のポイントはわかりませんが、それが行うことはすべてです
_config = new TMigrationsConfiguration
{
TargetDatabase = new DbConnectionInfo(connectionStringName)
};
その後
var migrator = new DbMigrator(_config);
migrator.Update();
だから私はDbMigratorのソースを見ていました。そこにはメソッドがあり、呼び出されたものをオーバーライドできGetPendingMigrationsます_historyRepository.GetPendingMigrations(_migrationAssembly.MigrationIds)
それで、クラスのpublic virtual IEnumerable<string> GetPendingMigrations(IEnumerable<string> localMigrations)メソッドを調べました。そのHistoryRepository仕事は、どの移行がすでに行われたかを把握することであり ( )、と=>databaseMigrationsの差を返します。localMigrationsdatabaseMigrationslocalMigrations.Except(databaseMigrations);
そのため、独自の一連の Id をそこに渡すことができます。これにより、カスタムの保留中の移行のセットを作成できます。
ただし、まだ問題があります。は、EF で定義されたクラスDbMigratorのinternal override void Upgrade(IEnumerable<string> pendingMigrations, string targetMigrationId, stringlastMigrationId)インスタンスを使用します。MigrationAssembly
foreach (var pendingMigration in pendingMigrations)
{
var migration = _migrationAssembly.GetMigration(pendingMigration);
そしてここにあるGetMigration(string migrationId):
public virtual DbMigration GetMigration(string migrationId)
{
DebugCheck.NotEmpty(migrationId);
var migration
= (DbMigration)_migrations
.SingleOrDefault(m => string.Equals(m.Id, migrationId, StringComparison.Ordinal));
if (migration != null)
{
migration.Reset();
}
return migration;
}
それは完璧です、私はそのクラスをオーバーライドする必要があります...ああ、待ってください:
internal class MigrationAssembly
それも内部です。では、どうすればこれらのプロパティをオーバーライドできますか?
ソースへのリンクは次のとおりですhttp://entityframework.codeplex.com
更新
ソースを編集せずにこれを行う方法がわかりませんでした。今、DbModelBuilderクラスを使用してカスタム移行アーキテクチャを作成しようとしています