Vin*_*els 13 asp.net-mvc entity-framework database-migration ef-code-first
我无法弄清楚为什么我的最新迁移没有在应用程序启动时自动执行(或者至少在首次访问数据库上下文时).我曾经在开发中手动运行update-database,但我想测试它是否会在托管测试环境中自动升级.
在Application_Start()中:
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
Run Code Online (Sandbox Code Playgroud)
在FepazoConfiguration中:
internal sealed class FepazoConfiguration :
DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
public FepazoConfiguration()
{
AutomaticMigrationsEnabled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我甚至将它添加到FepazoContext的构造函数中:
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
Run Code Online (Sandbox Code Playgroud)
一些额外的信息:
__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);
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法
作为一种解决方法,我DbMigrator.Update()在设置初始化程序后立即调用.虽然我仍然想知道它为什么不能自动运行,但这样做有所帮助...
protected void Application_Start()
{
// <...>
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
var dbMigrator = new DbMigrator(new FepazoConfiguration());
dbMigrator.Update();
// <...>
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,您在创建上下文实例后立即调用Database.Initialize()方法。在这种情况下,数据库将在调用Initialize()方法后立即创建,而不是等到第一次使用上下文。
Initialize() 方法采用一个布尔参数,该参数控制初始化过程是否应重新运行(如果已经为应用程序运行过)。
如果初始化过程已经执行,则指定false将跳过初始化过程。true值将再次初始化数据库,即使它已经初始化。