【问题标题】:EF Code first migrations not running after deploy to AzureEF Code first 迁移在部署到 Azure 后未运行
【发布时间】:2015-05-16 20:20:09
【问题描述】:

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

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

  1. 从生产中恢复
  2. 运行 Update-Database -ConfigurationTypeName Migrations.Auth.Configuration
  3. 运行 Update-Database -ConfigurationTypeName Migrations.UserProfile.Configuration

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

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

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

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

TLDR;代码优先迁移在发布到 Azure 后未运行

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

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

我看到了一些关于需要在我的 Startup 类中添加一些内容的参考资料,但我不确定如何继续。

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

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

更新 3

好的,挖出来,第一次访问数据库时我们出错了。是的,这是有道理的,因为模型已经改变,但是我已经进行了迁移,启用并检查了!同样,从包管理器控制台运行“更新数据库”时它工作正常,但在发布到 Azure 期间使用执行代码优先迁移时却不行

支持“AuthContext”上下文的模型自 数据库已创建。考虑使用 Code First 迁移来更新 数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

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

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

【问题讨论】:

  • 你看看这个帖子blogs.msdn.com/b/webdev/archive/2014/04/09/…,看起来你可能需要在 Global.asax 的 Application_Start 代码中添加代码
  • @J.W.谢谢,我已经看到了,它专门用于 Azure 云服务,我正在使用 Azure 网站,据说你不需要做任何额外的事情......
  • 我认为无论是什么项目,都必须确保db迁移代码运行。
  • @J.W.链接文章中的片段表明相反:“另一个选项是设置 Web.config 转换以对 Web.config 文件进行与单击执行代码优先迁移时 Visual Studio 所做的相同的更改”。 Visual Studio应该在部署期间设置必要的迁移,事实上,配置类被调用很明显,正在发生一些事情......
  • 我明白了,你有多个上下文,这是否意味着你有多个数据库,通常不能很好地与 EF 配合使用。

标签: entity-framework azure ef-code-first entity-framework-migrations


【解决方案1】:

这个帖子的答案不是很详细。

这篇文章解释了我必须做些什么来解决与此类似的问题: 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();

【讨论】:

  • 在我的发布助手中看不到 DATA 部分,但仍然可以使用,谢谢!
  • 优秀。我必须添加您提到的代码才能在启动时调用我的 Seed 方法。非常感谢,花了几个小时试图解决这个问题。
  • 谢谢你!你的解决方案适用于 Azure 生成的示例 Xamarin Forms 服务器代码项目。我没有添加到 global.asax.cs(因为我没有),而是将代码添加到 Startup.MobileApp.cs 中的 ConfigureMobileApp() 方法。
【解决方案2】:

解决了!总结后人的解决方案:

启用代码优先迁移仅针对每个选中的复选框启用一个基本连接字符串,无论有多少上下文针对该基本连接字符串进行了迁移。所以在我的例子中,我将这两个问题分解为两个不同的连接字符串。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      相关资源
      最近更新 更多