我无法弄清楚为什么我的最新迁移没有在应用程序启动时自动执行(或者至少在首次访问数据库上下文时)。我曾经跑过 更新数据库 手动开发,但我想测试它是否会在托管测试环境中自动升级。
在Application_Start()中:
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
在FepazoConfiguration中:
internal sealed class FepazoConfiguration :
DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
public FepazoConfiguration()
{
AutomaticMigrationsEnabled = true;
}
}
我甚至将它添加到FepazoContext的构造函数中:
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
一些额外的信息:
- 通过自动创建迁移 添加迁移 看起来不错
- 当我查询
__MigrationHistory
表,我可以看到迁移尚未被执行“记录”。 - 我验证了初始化程序或者
AutomaticMigrationsEnabled
Web.config文件中未覆盖设置。 - 断点
FepazoContext
构造函数和FepazoConfiguration
是 受到打击。
我忘了什么吗?我可以深入挖掘,找出它出错的地方吗?
更新
通过 True
至 Database.Initialize
尝试强制迁移也没有效果。 Database.CompatibleWithModel(true)
返回false - 因此系统检测到存在差异,但是它不执行挂起的迁移!
public FepazoContext() : base("DefaultConnection")
{
if (!Database.CompatibleWithModel(true))
{
// This is executed (each time the code enters)
Database.Initialize(true);
}
}
解决方法
作为解决方法,我打电话 DbMigrator.Update()
在设置初始化程序后立即显式。虽然我仍然想知道为什么它不会自动运行,但这样做有所帮助...
protected void Application_Start()
{
// <...>
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
var dbMigrator = new DbMigrator(new FepazoConfiguration());
dbMigrator.Update();
// <...>
}