实体框架 - 在Azure上进行迁移 - 实际场景 - 降级数据库

4

我已经在考虑了很长时间,幸运的是,我还没有需要这个答案,但我仍然想知道最佳方法。假设我们有以下设置:

  • Web API 建立在 Entity Framework(代码先行)和 Microsoft Azure 之上。
  • 启用了自动迁移(自动迁移到最新版本)
  • 我们有两个插槽 - ProductionStaging(都有单独的数据库)

让我们遵循以下场景:

  1. 我们将新版本部署staging slot(验证一切正常)
  2. 暂存数据库自动迁移到最新版本
  3. 我们将staging实例交换production插槽
  4. 迁移生产数据库上运行
  5. 由于某种原因,我们意识到需要降级并回到以前的版本。

好的,现在来了我的所有问题:

  1. 如何将数据库降级到以前的版本 - (因为我认为连接到生产环境并从程序包管理器控制台运行降级命令不是一个好主意)。
  2. 工作流程是否如下:使用当前实例降级数据库(这将导致 Web 应用程序短暂停机,因为迁移将不匹配),然后将旧的暂存插槽实例交换到生产插槽中?

我已经苦苦思考了一段时间,因为我无法找到任何理想的方法来做到这一点 - 因为当迁移不匹配时,实体框架会出现问题。

3个回答

1
你可以创建一个 SQL 脚本来降级数据库。请参阅本文的“获取 SQL 脚本”部分。

https://learn.microsoft.com/nb-no/ef/ef6/modeling/code-first/migrations/index#specific

在工作流程中,我们“解决”这个问题的方法是当前版本的数据库应支持旧版本的应用程序。只有在一个字段或表已经多个版本没有使用后,才被实际删除。这种方法存在缺点,数据库可能会变得臃肿和混乱。但它确实提供了灵活性,能够安装旧版本的应用程序。

谢谢您的回复,但它并没有真正回答我的问题。我的问题不是添加/删除列,而是如何避免在数据库上运行迁移时破坏应用程序。即使我保留了这些列,当已经应用了EF不知道的迁移时,它仍然意味着EF会出现问题。 - Jakub Holovsky

0
我们在公司采用类似的设置,而不是使用code-first迁移, 我们使用Fluent Migrator。随着应用启动代码的一部分,它运行所有未完成的迁移。与任何解决方案一样,您需要编写Up和Down代码,以便它知道如何执行升级和降级操作。

谢谢,我的问题不是创建迁移,而是在不破坏EF的情况下降级生产数据库的整个工作流程,因为当前模型与数据库架构不匹配(即之前已经应用了迁移)。 - Jakub Holovsky
所以这里的问题是你需要将两个独立的系统,即应用程序和数据库保持同步。为了处理这个问题,您需要对数据库模式进行版本控制,并对应用程序进行版本控制。幸运的是,通过数据库备份和源代码控制标签,您应该能够恢复到特定时间点而不会出现任何问题。问题在于当您不想丢失添加到数据库中的任何数据时,就需要使用降级,以便知道应如何撤消对数据的更改。 - jbeverid

0

经过与其他开发人员的讨论,我得出结论,我们有两个选择:

  1. 通过 Azure 门户(云 shell 命令)将数据库降级到以前的迁移,切换实例,闭上眼睛祈祷一切都会好起来。
  2. 更安全的方法似乎是发布一个补丁迁移或修补您的代码并发布新版本。特别是因为您的新代码已经发布了一次,修复它可能比玩还原游戏更明智。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接