Entity Framework 迁移中测试架构更改

3

背景

我正在处理一个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中;因此新迁移不会被持久化/开发人员需要手动重新运行此操作)。

查看可用选项,只有addremovelistscript,因此没有明显的选项来执行此检查。

我可以在我的管道中在script命令之前运行add命令以确保已运行; 但是,由于如果添加的迁移未推送到git,则下一次迭代将不会意识到此迁移,因此可能会出现问题。

如果我将这个新的迁移推到git中,那么就解决了这个问题;但是,这将创建一个新问题,即每次构建都会创建一个新迁移,因此我们将拥有大量冗余的混乱/这种方法将无法持续。

我能想到的最好的解决方案是运行add命令,然后检查生成的脚本,看看UpDown方法是否在函数体中有任何内容;但这感觉很hacky;而且我不确定它是否足够(例如,在.cs文件中是否会产生任何Up/Down的变化,而不产生.Designer.cs文件中的变化?)。
我相信微软会在工具集中创建一些东西来解决这个问题;但我很难找到它。提前感谢您的帮助。

现有/类似的回答


你找到解决办法了吗? - undefined
1
很遗憾,这是由开发人员根据自己的理解来创建迁移的,如果有漏掉的迁移导致新功能失败,我们只能依靠测试代码和质量保证团队去发现。目前这种方式还勉强够用,虽然有时候让人感到沮丧,觉得应该有办法自动化并消除人为错误的可能性。 - undefined
1
在旧版的 EF 中,有一些方法可以通过编程方式测试更改,可惜 EF Core 不允许我们这样做。 - undefined
1个回答

3
我尝试过一些简单的测试案例,似乎可以通过添加一个测试迁移来检查迁移目录中的<ContextName>ModelSnapshot.cs文件是否已更改。只有核心迁移被修改时,该文件才会发生变化。

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