如果不应在生产环境中使用 MigrateAsync(),如何应用 EF Core 迁移?

How to apply EF Core migrations if you should not use MigrateAsync() for production environments?

我创建了一个新的 .Net 5 项目并想使用 EF Core。我使用

自动生成了多个 migration.cs 文件

dotnet ef migrations add MyMigration

并想应用它们(用于开发和生产)。我知道 MigrateAsync 方法,所以我了解了如何在启动时调用此方法

https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-part-1/

但我到处都读到这种方法不应该用于生产,因为这些迁移不会在单个事务中执行(没有错误回滚)。

不幸的是,无论环境如何,资源都不多,我找到了这篇文章

https://www.thereformedprogrammer.net/handling-entity-framework-core-database-migrations-in-production-part-2

一个选项可以是调用迁移的控制台应用程序

https://www.thereformedprogrammer.net/handling-entity-framework-core-database-migrations-in-production-part-2/#1b-calling-context-database-migrate-via-a-console-app-or-admin-command

但是我无法理解这种方法的区别,因为它没有解决交易问题?

在 development/production 期间应用迁移的最佳做法是什么?

最有效的方法在很大程度上取决于部署管道的工作方式——生产前有多少环境、发布周期、部署的哪些部分是自动化的。没有通用的“最佳实践”——每种处理迁移的方式都有自己的一套权衡需要注意。根据您的需求和期望选择升级程序。

在为中型项目(大约 70 个表)设置 EF Core 迁移时,我尝试了几种可能的方法。我对过程的观察以及最终的结果:

  1. 您想在更改模型和部署到生产之间的某处进行迁移 SQL,如果只是为了查看它以防出现任何可能导致回滚问题的重大更改。我们决定直接在带有 dbcontext 的项目中进行迁移,并为每个可能部署到任何环境的构建生成一个迁移脚本(使用 dotnet ef migrations script --idempotent)——在我们的例子中,一个 CI 步骤每次推送到 t运行k 或释放分支。
  2. 将迁移 SQL 置于版本控制中,并将 SQL 视为数据库结构的真实来源,以便在您想要保留某些列用于备份或向后时手动修改脚本兼容性目的。另一种选择是将您的数据模型视为数据库模式的参考,并将迁移 SQL 视为未保留的中间步骤,这使得整个过程自动化更容易,但需要您直接在您的数据库中处理特殊情况数据模型。
  3. 在生成迁移脚本时使用 --idempotent 标志为您提供了一个脚本,您可以将其重新应用于数据库模式,而不管它处于什么模式版本,让它只执行尚未执行的步骤。这意味着您可以在不破坏架构的情况下将相同的迁移脚本重新应用于已迁移的数据库。如果您的应用程序的不同版本 运行 在不同的环境(开发、暂存和生产环境)中并行运行,它可以节省手动跟踪您需要应用的迁移脚本版本以及应用顺序的问题。
  4. 当您进行迁移 SQL 时,您可以使用原生的数据库工具,以便将它们应用到目标环境 - 例如 sqlcmd 用于 SQL 服务器,psql 用于 postgres。这还有一个好处,即让具有更高权限(架构修改)的单独用户处理迁移,而您的应用程序在有限的权限下运行,通常无法触及架构。
  5. 应用数据库迁移是应用程序部署的一部分,而不是应用程序启动的一部分 - 如果您有某种部署自动化,它可能是针对目标数据库执行迁移的最佳位置,同样 - 数据库本机客户端是一个很好的替代方案DbUp,随便选一个吧。将迁移与应用程序启动分开还使您能够 运行 应用程序针对不匹配但仍然兼容的数据库模式 - 这在例如您正在进行推出部署。
  6. 架构升级的大多数问题都来自破坏版本之间的架构兼容性 - 避免这种情况需要在处理数据模型时注意 backwards/forward 兼容性,并将重大更改拆分为单独的版本,至少保留 backwards/forward 的单个步骤=36=]s 兼容性——你是否需要它取决于你的项目,这是你应该决定的事情。我们 运行 针对当前数据库模式针对先前版本以及针对先前数据库模式针对当前版本的完整集成测试套件,以确保在两个后续版本之间不会引入重大更改 - 任何移动多个版本的部署都将逐个推出迁移一,假设迁移脚本或应用程序启动可以包括从旧模型到新模型的数据转换。

总结:生成迁移 SQL 并在版本部署上使用本机工具或 DbUp 使您可以在一定程度上手动控制迁移过程,并且可以通过自动化部署过程来实现易用性。出于开发目的,您还可以在应用程序启动时添加自动迁移,最好仅在环境设置为 Development 时应用 - 只要团队中的每个人都有自己的开发数据库(本地 SQL,个人在共享服务器上,如果您使用 filedb SQL),则无需担心冲突。