C# 实体框架使用特定的DbMigration实例进行迁移

C# 实体框架使用特定的DbMigration实例进行迁移,c#,.net,entity-framework,plugins,C#,.net,Entity Framework,Plugins,我正在构建EntityFramework5的模块化实现,并尝试实现模块化迁移 其思想是每个模块都可以注册其迁移,这些迁移是EF已用于注册迁移的DbMigration实例。 我打算使用这个概念来迁移应用程序启动和加载模块上的数据库 然后 var migrator = new DbMigrator(_config); migrator.Update(); 因此,我查看了DbMigrator的源代码,其中有一个方法可以重写,名为GetPendingMigrations,返回_historyRepos

我正在构建EntityFramework5的模块化实现,并尝试实现模块化迁移

其思想是每个模块都可以注册其迁移,这些迁移是EF已用于注册迁移的DbMigration实例。 我打算使用这个概念来迁移应用程序启动和加载模块上的数据库

然后

var migrator = new DbMigrator(_config);
migrator.Update();
因此,我查看了DbMigrator的源代码,其中有一个方法可以重写,名为GetPendingMigrations,返回_historyRepository.GetPendingMigrations_migrationAssembly.MigrationId

然后我看了HistoryRepository类中的公共虚拟IEnumerable GetPendingMigrationIEnumerable localMigrations方法,它的工作是找出已经发生了哪些迁移databaseMigrations并返回localMigrations和databaseMigrations=>localMigrations.ExceptdatabaseMigrations之间的差异

因此,我可以在那里传递我自己的一组Id,这允许我创建一组自定义的挂起迁移

但问题依然存在,;DbMigrator的内部重写void UpgradeIEnumerable pendingMigrations、string targetMigrationId、stringlastMigrationId使用EF中定义的MigrationAssembly类的实例

foreach (var pendingMigration in pendingMigrations)
        {
            var migration = _migrationAssembly.GetMigration(pendingMigration);
下面是GetMigrationstring迁移ID:

太好了,我应该重写那个类。。。哦,等等:

internal class MigrationAssembly
它也是内部的。那我怎么能覆盖这些属性呢

这里有一个到源代码的链接

更新
如果不编辑源代码,我想不出一种方法来实现这一点。现在,我正在考虑使用DbModelBuilder类创建一个自定义迁移体系结构,这就是您想要做的:几乎。我不知道多租户是否允许您跨上下文访问外键模型。我认为这是可能的。你知道吗?
foreach (var pendingMigration in pendingMigrations)
        {
            var migration = _migrationAssembly.GetMigration(pendingMigration);
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