エンティティ フレームワーク (5) のモジュラー実装を構築しており、モジュラー マイグレーションを実装しようとしています。
アイデアは、各モジュールが DbMigration のインスタンスである移行を登録できるということです (移行を登録するために EF が既に使用しているもの)。この概念を使用して、
データベースを何度も移行するつもりですApplication_Start
Modules_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
の差を返します。localMigrations
databaseMigrations
localMigrations.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
クラスを使用してカスタム移行アーキテクチャを作成しようとしています