我无法弄清楚为什么我的最新迁移没有在应用程序启动时自动执行(或至少在第一次访问数据库上下文时)。我曾经在开发中手动运行update-database,但我想测试它是否会在我的托管测试环境中自动升级。
在 Application_Start() 中:
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
在 Fepazo 配置中:
internal sealed class FepazoConfiguration :
DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
public FepazoConfiguration()
{
AutomaticMigrationsEnabled = true;
}
}
我什至将它添加到 FepazoContext 的构造函数中:
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
一些额外的信息:
- 迁移是通过add-migration自动创建的,看起来不错。
- 当我查询
__MigrationHistory
表时,我可以看到迁移尚未“记录”为执行。 - 我验证了
AutomaticMigrationsEnabled
Web.config 文件中的初始化程序或设置没有被覆盖。 FepazoContext
构造函数中的断点和FepazoConfiguration
被击中。
我是不是忘记了什么?我可以深入挖掘以找出问题所在吗?
更新
通过True
toDatabase.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();
// <...>
}