MigrateDatabaseToLatestVersion未执行

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 正在受到打击.

我忘记了什么吗?我可以深入挖掘,找出它出错的地方吗?

更新

传递TrueDatabase.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)

App*_*ere 7

根据此处另一个答案,初始化程序在与数据库进行某些交互之前不会运行.答案解释了如何强制初始化程序立即运行.


Sey*_*baf 2

在上面的代码片段中,您在创建上下文实例后立即调用Database.Initialize()方法。在这种情况下,数据库将在调用Initialize()方法后立即创建,而不是等到第一次使用上下文。

Initialize() 方法采用一个布尔参数,该参数控制初始化过程是否应重新运行(如果已经为应用程序运行过)。

如果初始化过程已经执行,则指定false将跳过初始化过程。true值将再次初始化数据库,即使它已经初始化。