c# - 如何自动检查我没有忘记添加ef核心代码首先迁移
问题描述
我们首先使用带有代码的 Entity Framework Core 2.2。有时我更改了其中一个实体,但忘记创建新迁移,或者我创建迁移但仅在一个上下文中(我们有不同的数据库引擎)。我想自动检查它(理想情况下作为 NUnit 测试),以便每次提交时它都在我们的 CI 服务器中运行。
手动我会尝试创建一个新的迁移并检查创建的 Up() 和 Down() 方法是否为空。有什么办法可以作为 NUnit 测试吗?
解决方案
创建测试的困难在哪里:
- 创建一个新的数据库
- 应用所有当前迁移以创建架构
- 尝试使用所有实体。它可以像添加实体一样简单,查询该实体并深入比较它们是否相同。
- 删除数据库
如果架构没有新实体的迁移或实体的更改,您肯定会从中得到 SQL 错误。
当然,每次创建新实体时,都需要添加新测试。但是,如果您使用的是 TDD,那应该已经发生了。
速度也不应该是一个问题,因为创建和删除数据库不应该超过几秒钟,并且不会有很多这样的测试。它们可以并行化。
如果您想花哨并且不想为每个实体编写测试,则可以执行以下操作:
- 使用反射来获取 Context 支持的所有实体类型。
- 使用Bogus或AutoFixture等自动数据生成器为实体填充数据。
- 通过 DB 往返实体。
- 使用像Compare-Net-Objects这样的深度比较器将原始数据与检索到的数据进行比较。
这种自动化方法的有用性取决于您的数据模型的复杂性。只适用于简单的模型。但如果模型很复杂,则需要进行大量调整和覆盖。
推荐阅读
- php - Laragon : 错误消息 : (include_path='.;C:/laragon/etc/php/pear') 在第 0 行的未知
- checkbox - 如何在警报控制器中配置复选框并在 Ionic 4 中返回值?
- css - 使用“as”属性时,样式化组件不继承样式
- python - 'utf-8' 编解码器无法解码位置中的字节 0x96 ...当通过 pandas read_csv 读取文本文件时
- python - circleci:pip install dlib 失败
- c# - C#返回错误'子查询返回超过1个值'但这应该没问题
- java - Array.sort() 和 JAVA 中的对象的问题
- flutter - Flutter 状态小部件未更新
- arrays - 如何从两个双列表中删除条目,以使它们的第二列在某个错误内匹配
- android - Android Studio 终端未显示