背景
我正在处理一个dot net core项目的流水线。在我的流水线中,在构建阶段,我运行 dotnet ef migrations script --context "MyDbContext" --project "./MySolution/MyDataProject/" --output "./migrationScript.sql" --idempotent
生成脚本,稍后可以针对各种测试、暂存和生产环境数据库运行这些脚本来同步模式(我在非生产环境中使用与生产环境相同的方法来确保这些脚本已经过测试)。
我理解这些脚本不是基于数据库上下文生成的,而是使用项目中已定义的迁移;这些迁移是通过add
命令定义的(例如:dotnet ef migrations add vNext --context "MyDbContext" --project "./MySolution/MyDataProject/"
)。因此,开发人员可能会更改数据模型,忘记运行migrations add
命令以添加新的迁移,从而创建无法更新模式的解决方案。
问题
有没有一种方法可以测试迁移是否与代码同步/是否需要新的迁移?
解决方案思路
我希望通过运行dotnet ef migrations add
时,如果dbContext没有更改,则不会有任何输出; 这样我就可以测试是否存在新文件,并在此被忽略(不将任何内容提交到git中;因此新迁移不会被持久化/开发人员需要手动重新运行此操作)。
查看可用选项,只有add
,remove
,list
和script
,因此没有明显的选项来执行此检查。
我可以在我的管道中在script
命令之前运行add
命令以确保已运行; 但是,由于如果添加的迁移未推送到git,则下一次迭代将不会意识到此迁移,因此可能会出现问题。
如果我将这个新的迁移推到git中,那么就解决了这个问题;但是,这将创建一个新问题,即每次构建都会创建一个新迁移,因此我们将拥有大量冗余的混乱/这种方法将无法持续。
我能想到的最好的解决方案是运行add
命令,然后检查生成的脚本,看看Up
或Down
方法是否在函数体中有任何内容;但这感觉很hacky;而且我不确定它是否足够(例如,在.cs
文件中是否会产生任何Up/Down的变化,而不产生.Designer.cs
文件中的变化?)。我相信微软会在工具集中创建一些东西来解决这个问题;但我很难找到它。提前感谢您的帮助。
现有/类似的回答
- 在EF Core中,如何检查是否需要迁移? - 这个点回答了关于应用迁移的问题,但没有关于生成迁移的问题。