Asp.net mvc 未执行MigrateDatabaseToLatestVersion

Asp.net mvc 未执行MigrateDatabaseToLatestVersion,asp.net-mvc,entity-framework,ef-code-first,database-migration,Asp.net Mvc,Entity Framework,Ef Code First,Database Migration,我不明白为什么我的最新迁移在应用程序启动时(或者至少在第一次访问数据库上下文时)不会自动执行。我曾经在开发中手动运行更新数据库,但我想测试它是否会在托管测试环境中自动升级 在应用程序中\u Start(): Database.SetInitializer<FepazoContext>( new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>()) internal sealed

我不明白为什么我的最新迁移在应用程序启动时(或者至少在第一次访问数据库上下文时)不会自动执行。我曾经在开发中手动运行更新数据库,但我想测试它是否会在托管测试环境中自动升级

在应用程序中\u Start():

Database.SetInitializer<FepazoContext>(
    new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
internal sealed class FepazoConfiguration : 
    DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
    public FepazoConfiguration()
    {
        AutomaticMigrationsEnabled = true;
    }
}
public FepazoContext() : base("DefaultConnection")
{
    Database.Initialize(false);
}
一些额外信息:

  • 迁移是通过添加迁移自动创建的,看起来正常
  • 当我查询
    \uu MigrationHistory
    表时,我可以看到迁移尚未在执行时“记录”
  • 我验证了在Web.config文件中没有覆盖初始值设定项或
    AutomaticMigrationsEnabled
    设置
  • FepazoContext
    构造函数和
    FepazoConfiguration
    中的断点被命中
我忘了什么吗?我能再深入一点找出哪里出了问题吗

更新

True
传递到
数据库。初始化
以尝试并强制迁移也没有效果
Database.CompatibleWithModel(true)
返回false-因此系统检测到存在差异,但它不会执行挂起的迁移

public FepazoContext() : base("DefaultConnection")
{
    if (!Database.CompatibleWithModel(true))
    {
        // This is executed (each time the code enters)
        Database.Initialize(true);
    }
}
解决方法

作为一种解决方法,我在设置初始值设定项之后立即显式调用
dbmigator.Update()
。这就是诀窍,尽管我仍然想知道为什么它不能自动工作

protected void Application_Start()
{
    // <...>
    Database.SetInitializer<FepazoContext>(
        new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
    var dbMigrator = new DbMigrator(new FepazoConfiguration());
    dbMigrator.Update();
    // <...>
}
受保护的无效应用程序\u Start()
{
// 
Database.SetInitializer(
新的MigrateDatabaseToLatestVersion());
var dbmigator=new dbmigator(new FepazoConfiguration());
dbMigrator.Update();
// 
}

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

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


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

根据初始化程序,只有在与数据库进行某种交互后才会运行。答案解释了如何强制初始化器立即运行。

我遇到了这个问题。我的问题是,我有一个MigrationContextFactory,用于提供连接字符串。当数据库初始化发生时,正在调用迁移上下文工厂。此MigrationContextFactory正在获取到其他数据库的连接字符串,并确保该字符串是最新的


我删除了migrationContextFactory,并将true传递给MigrateDatabaseToLatestVersion,告诉它使用当前上下文。请参阅此问题的最热门答案

确保MigrateDatabaseToLatestVersion将使用应用程序正在使用的正确上下文。这是通过使用参数useSuppliedContext完成的

Database.SetInitializer<FepazoContext>(
    new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>(useSuppliedContext: true));
Database.SetInitializer(
新的MigrateDatabaseToLatestVersion(useSuppliedContext:true));

更改后,我的MVC应用程序确实更新了我的数据库。

谢谢您的回答。但这并不能解释为什么系统没有检测到必须使用最新的迁移更新数据库。我尝试将
true
作为参数传递给
数据库。Initialize()
以强制升级,但即使这样也无法执行。当然,这就是为什么我在第一句话中添加了“(或至少在首次访问数据库上下文时)”,以及为什么我说我尝试了
数据库。Initialize(true)无效。不幸的是,这个问题的解决方案并没有那么简单;)哇,我花了15分钟研究这个问题,因为我正在启动我的应用程序,但没有登录(/与应用程序交互),事实上,它必须与DB交互才能执行迁移:')我假设因为
IDatabaseInitializer.InitializeDatabase(TContext)
接受了一个
TContext
参数,它总是使用提供的上下文。所有其他内置初始值设定项甚至都没有这个选项,所以奇怪的是,它们给出了与框架其余部分不一致的行为。(抱歉咆哮)。