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

时间:2012-12-21 00:40:14

标签: c# .net entity-framework plugins

我正在构建实体框架的模块化实现(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)并返回{之间的差异{1}}和localMigrations =&gt; databaseMigrations

所以我可以在那里传递我自己的Id,这允许我创建一组自定义的待定迁移。

然而仍有问题; localMigrations.Except(databaseMigrations);的{​​{1}}使用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)

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

以下是指向来源http://entityframework.codeplex.com

的链接

更新 没有编辑源代码,我无法找到一种方法。现在我正在寻找使用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; }

创建自定义迁移体系结构

0 个答案:

没有答案