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