1

エンティティ フレームワーク (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 で定義されたクラスDbMigratorinternal 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クラスを使用してカスタム移行アーキテクチャを作成しようとしています

4

0 に答える 0