Entity Framework - Azure 上的迁移 - 真实场景 - 降级数据库
Entity Framework - Migrations on Azure - Real Life Scenario - Downgrading database
我已经考虑了很长时间,幸运的是我还不需要这个答案,但是我仍然想知道最好的方法。假设我们有以下设置:
- Web API 建立在 Entity Framework 之上(代码优先)在 微软 Azure.
- 启用自动迁移(自动迁移到最新版本)
- 我们有两个插槽 - Production & Staging(两者都有单独的数据库)
让我们跟随这个场景:
- 我们部署一个新版本到暂存槽(验证一切正常)
- 登台数据库自动迁移到最新版本
- 我们 swap staging 实例到 production slot
- 迁移 运行 生产 数据库
- 我们意识到 - 无论出于何种原因 - 我们需要降级并移至以前的版本。
好的,现在我的问题都来了:
- 我们如何将数据库降级到以前的版本-(因为我认为将 VS 连接到生产环境并运行从包管理器控制台执行降级命令不是一个好主意)。
- 工作流程是否如下:使用当前实例降级数据库(这将导致 Web 应用程序短暂停机,因为迁移不匹配),然后将暂存槽(旧)实例交换到生产槽?
我已经为此绞尽脑汁了一段时间,因为我看不到任何理想的方法来做到这一点 - 因为 entity framework 在迁移不匹配时中断。
您可以创建一个 SQL 脚本来降级数据库。请参阅本文的 "Getting a SQL Script" 部分。
https://docs.microsoft.com/nb-no/ef/ef6/modeling/code-first/migrations/index#specific
在工作流程上,我们的方式"solve"这是当前版本的数据库应该支持旧版本的应用程序。
只有在一个字段或者table没有被几个版本使用过之后,才真正被删除。这种方法有缺点,数据库会变得臃肿和混乱。但它确实提供了安装应用程序旧版本的灵活性。
我们公司有类似的设置,但我们没有使用代码优先迁移,而是使用 Fluent Migrator。作为应用程序启动代码的一部分,它运行所有未完成的迁移。
就像您会发现的任何解决方案一样,您需要编写 Up 和 Down 代码,以便它知道如何升级和降级。
经过与其他开发人员的一些讨论,我得出的结论是我们确实有两个选择:
- 通过Azure Portal(云shell命令)将数据库降级到之前的迁移,切换回实例,闭上眼睛祈祷一切都会好起来。
- Safer 似乎发布了补丁迁移或补丁代码并发布了新版本。特别是因为您的新代码已经发布,所以修复它比恢复游戏更明智。
我已经考虑了很长时间,幸运的是我还不需要这个答案,但是我仍然想知道最好的方法。假设我们有以下设置:
- Web API 建立在 Entity Framework 之上(代码优先)在 微软 Azure.
- 启用自动迁移(自动迁移到最新版本)
- 我们有两个插槽 - Production & Staging(两者都有单独的数据库)
让我们跟随这个场景:
- 我们部署一个新版本到暂存槽(验证一切正常)
- 登台数据库自动迁移到最新版本
- 我们 swap staging 实例到 production slot
- 迁移 运行 生产 数据库
- 我们意识到 - 无论出于何种原因 - 我们需要降级并移至以前的版本。
好的,现在我的问题都来了:
- 我们如何将数据库降级到以前的版本-(因为我认为将 VS 连接到生产环境并运行从包管理器控制台执行降级命令不是一个好主意)。
- 工作流程是否如下:使用当前实例降级数据库(这将导致 Web 应用程序短暂停机,因为迁移不匹配),然后将暂存槽(旧)实例交换到生产槽?
我已经为此绞尽脑汁了一段时间,因为我看不到任何理想的方法来做到这一点 - 因为 entity framework 在迁移不匹配时中断。
您可以创建一个 SQL 脚本来降级数据库。请参阅本文的 "Getting a SQL Script" 部分。
https://docs.microsoft.com/nb-no/ef/ef6/modeling/code-first/migrations/index#specific
在工作流程上,我们的方式"solve"这是当前版本的数据库应该支持旧版本的应用程序。
只有在一个字段或者table没有被几个版本使用过之后,才真正被删除。这种方法有缺点,数据库会变得臃肿和混乱。但它确实提供了安装应用程序旧版本的灵活性。
我们公司有类似的设置,但我们没有使用代码优先迁移,而是使用 Fluent Migrator。作为应用程序启动代码的一部分,它运行所有未完成的迁移。
就像您会发现的任何解决方案一样,您需要编写 Up 和 Down 代码,以便它知道如何升级和降级。
经过与其他开发人员的一些讨论,我得出的结论是我们确实有两个选择:
- 通过Azure Portal(云shell命令)将数据库降级到之前的迁移,切换回实例,闭上眼睛祈祷一切都会好起来。
- Safer 似乎发布了补丁迁移或补丁代码并发布了新版本。特别是因为您的新代码已经发布,所以修复它比恢复游戏更明智。