.net-core - 如何避免 EF Core 迁移和自定义迁移操作(自定义 SQL)的部署错误
问题描述
我在我的 .NET Core 项目中使用 EF Core 迁移,并使用 DevOps 管道进行部署。
在我的构建管道中,我使用命令行任务构建迁移 SQL 脚本来执行dotnet ef migrations script
命令(使用--idempotent
选项),然后使用 Azure SQL 数据库部署任务在发布管道中执行它。一切都相当标准,从简单的谷歌搜索(例如这里)判断,这是我首先了解该方法的方式。
这是我的问题:为了达到某些预期的结果,在我的一些迁移中,我使用自定义迁移操作 ( migrationBuilder.Sql("...")
) 来执行一些手工制作的 SQL 作为迁移的一部分。
但是,随着项目的发展,我的数据库模式会随着时间的推移而变化,旧的此类迁移不可避免地包含不再适合模式的 SQL。有人会认为这不是问题,因为任何迁移都只适用于具有某些特定模式版本的数据库。然而,事实证明,该dotnet ef migrations script
命令构建了一个带有一堆条件 SQL 块的 SQL 脚本,如下所示:
IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20190123160628_SomeMigrationId')
BEGIN
/* Generated or custom SQL here */
END;
注意:每个迁移都包含在脚本中,IF NOT EXIST 子句确保只有尚未应用的迁移在数据库中执行。
但是,自定义迁移任务 SQL 语句按原样包含在脚本中,如果它们过时,它们将不再编译。然后数据库部署任务失败,整个部署也是如此。
有没有其他人遇到过并解决了这个问题,或者知道另一种部署没有这个问题的迁移的方法?在我看来,这严重影响了 MigrationBuilder.Sql() 命令的实用性,这是在迁移过程中任意“按摩”数据的唯一方法。
解决方案
推荐阅读
- ubuntu - wsl:不使用 sudo 挂载 - 权限被拒绝
- node.js - 为什么会出现这个语法错误 internal/modules/cjs/loader.js:584 throw err; ^?
- interface - 如何解决 OCaml 循环构建错误?
- python - 如何使用 Win32com 查找和替换。我的代码不会执行替换
- c# - 替换IIS中域URL的一个单词
- python - 如何将 httpie 与 httpie-aws-authv4 捆绑到 Python zipapp 中?
- android - 在服务中使用通过 Intent 选择器检索到的 Uri
- automata - CFL 的闭合特性
- excel - 一维数组中的输入范围
- recovery - 需要的超卡数据文件类型和启动模式