部署到 Azure 后,EF Code 首次迁移不是 运行

EF Code first migrations not running after deploy to Azure

我有两个用于迁移的文件夹(AuthContext 和 UserProfileContext),每个文件夹都有自己的迁移和一些自定义 sql 到 运行 之后用于数据迁移等等。

这在使用包管理器控制台时工作正常。我

  1. 从生产中恢复
  2. 运行 更新数据库 -ConfigurationTypeName Migrations.Auth.Configuration
  3. 运行 更新数据库 -ConfigurationTypeName Migrations.UserProfile.Configuration

然后在新数据库中一切都非常愉快,迁移执行数据在需要的地方洗牌。

我尝试通过以下方式测试发布部分的迁移:

  1. 在开发数据库上恢复生产
  2. 指向开发数据库的单个连接字符串(所有上下文使用相同的字符串)
  3. 发布到 Azure 网站
  4. 选中应用代码优先迁移复选框
  5. 选择了那个单一的连接字符串

好的,它发表得很好;然而,当我去查看数据库时,什么也没有发生!它没有创建必要的表、列或数据移动。

TLDR; Code first migrations are not running after publish to Azure

更新 1 我尝试了以下任意组合:只有一个连接字符串,所以我猜这不是问题,并且执行迁移已被选中。

发布 api 运行,但未对数据库进行任何更改。我想也许我需要先点击它,但当我尝试使用 api(现在当然依赖于新的数据库设置)时,我只是遇到随机错误,而且数据库仍然没有改变。

我看到一些关于需要向我的 Startup 添加一些东西的参考资料 class 但我不确定如何继续。

更新 2 我通过在连接字符串中添加 "Persist Security Info=True" 解决了一个问题。现在它实际上连接到数据库并调用我的 API;但是,没有迁移 运行ning。 我将调试器附加到 Azure 开发环境并逐步完成...在我的第一个数据库调用中,它进入了相关迁移的配置 class,然后是 barfs,我无法追踪错误。

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\Auth";
    ContextKey = "AuthContext";
}

更新 3

好的,深入挖掘,第一次访问数据库时我们出错了。是的,这是有道理的,因为模型已经改变,但我已经进行了迁移、启用和检查!同样,当从程序包管理器控制台 运行ning "Update-Database" 时它工作正常,但在发布到 Azure

期间使用执行代码优先迁移时则不然

The model backing the 'AuthContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

更新 4 好的,我在这里找到了根本问题。 VS 仅在我的一个数据库上下文中为 databaseInitializer 设置了额外的 web.config 属性,未提及的那个实际上是我的应用程序首先命中的。

所以现在我必须弄清楚如何让它包含多个上下文,或者将我所有的东西组合到一个上下文中。

已解决!总结后代的解决方案:

启用 Code First 迁移仅针对选中的每个复选框启用一个基本连接字符串,而不管有多少上下文针对该基本连接字符串进行了迁移。所以在我的例子中,我将有问题的两个分成两个不同的连接字符串。

然后我遇到了其他错误并发现如果您将基本连接字符串更改为模型支持 asp 身份,您需要包含(一次发布)附加标志 base("AuthContext" , throwIfV1Schema: false)

这个post的回答不是很详细。

这篇文章解释了我必须做些什么才能解决与此类似的问题: https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/

我将在下面大致描述我必须采取的步骤:

步骤 1 将您的连接字符串添加到您的 dbContexts,在我的情况下,它们都是相同的。

步骤 2 将此添加到您的 web.config

 <appSettings>
    <add key="MigrateDatabaseToLatestVersion" value="true"/>
  </appSettings>

步骤 3 并将其添加到 global.asax.cs / Startup.cs(OWIN startup)

的底部
    var configuration = new Migrations.Configuration();
    var migrator = new DbMigrator(configuration);
    migrator.Update();

对于遇到此问题并且可能忽略了以下内容的任何人:请务必检查您是否已在 Azure 上的 Web.config 文件 and/or 应用程序设置中正确设置连接字符串。这包括 DefaultConnection 和 DefaultConnection_DatabasePublish。

在我们的例子中,前者是正确的,但后者包含错误的数据库实例,因为它是从应用服务克隆操作中转移过来的。因此迁移了错误的数据库。