前几年的 EF 迁移
EF Migrations from previous years
过去 4 年我一直在从事一个项目。目前我们有 2,510 次迁移,随着系统变得更加复杂并添加新功能,预计会继续增加。
good/bad 进行这种数量的迁移是一种做法吗?
我们正在讨论删除所有迁移并创建一个代表整个数据库的新迁移的选项,但我们不知道这是一个好的做法。有没有人有做这种事情的经验?
如果您可以从头开始重建,那么进行过多的迁移并没有什么不好。在工作生产环境中,迁移实际上只是启动开发机器和 运行 或回滚错误版本等的一种方式。
不过,我个人喜欢不时地重置迁移。我们有同样的问题,1000 次迁移,由于提交的人为错误和名称空间更改(在此处插入原因),它不太可能在延长的时间内重建。
事实上,随着生产,它永远不会被重建,它只用于开发测试机器。
虽然有一些非常重要的缺点风险,如果您的 UP
中有自定义代码和脚本来做各种事情(您可能会这样做),那么您必须小心并添加它们回来,还要备份一切!
免责声明,我不提倡任何人这样做,除非他们确切地知道自己在做什么。进行大量迁移很好,在任何正常情况下都不会导致问题,但是搞砸生产数据库可能会花费很多。
进一步阅读
如果你想完成这个
- Resetting Entity Framework Migrations to a clean Slate
- Reset Entity-Framework Migrations
在我看来 collapsing_migrations 的风险不是_collapsing_migrations。
C - 崩溃迁移
风险:
- C_R1 - 结果数据库不是它应该的样子,因为:
- 创建摘要迁移时,单个迁移中的自定义更改会丢失
- 其他原因
- C_R2 - 部署风险:不简单的部署(包括修改 migration_history table)
好处:
- C_B1 - 重新创建数据库的代码启动速度更快(快多少?)
- C_B2 - 更清洁的解决方案
- C_B3 - 当前迁移包含在新数据库版本中弃用的操作
- C_B4 - (我不推荐这个,见下文)如果最初使用较新版本的 EF 完成,新版本的 EF 可能会创建更好 [=70=],甚至可能修复错误,或突出显示问题。
NC - 不折叠迁移
- NC_R3 - 迁移达到限制 - 高影响,不太可能,应在 PROD
之前检测到
无论如何...让我们这样做
我不推荐它,但如果您决定崩溃迁移,这里有两种方法可以降低风险 C_R1
(结果数据库 != 当前数据库,因为一些自定义代码是 'lost in translation' ).
一个。使用外部工具创建表示数据库的初始脚本,并使用生成的 sql
作为第一个新迁移的基础(而不是 运行 添加迁移并使用 EF 自带的代码达)。
乙。使初始迁移包含所有迁移的代码(而不是仅 运行 添加迁移并使用 EF 提供的代码)。
过去 4 年我一直在从事一个项目。目前我们有 2,510 次迁移,随着系统变得更加复杂并添加新功能,预计会继续增加。
good/bad 进行这种数量的迁移是一种做法吗?
我们正在讨论删除所有迁移并创建一个代表整个数据库的新迁移的选项,但我们不知道这是一个好的做法。有没有人有做这种事情的经验?
如果您可以从头开始重建,那么进行过多的迁移并没有什么不好。在工作生产环境中,迁移实际上只是启动开发机器和 运行 或回滚错误版本等的一种方式。
不过,我个人喜欢不时地重置迁移。我们有同样的问题,1000 次迁移,由于提交的人为错误和名称空间更改(在此处插入原因),它不太可能在延长的时间内重建。
事实上,随着生产,它永远不会被重建,它只用于开发测试机器。
虽然有一些非常重要的缺点风险,如果您的 UP
中有自定义代码和脚本来做各种事情(您可能会这样做),那么您必须小心并添加它们回来,还要备份一切!
免责声明,我不提倡任何人这样做,除非他们确切地知道自己在做什么。进行大量迁移很好,在任何正常情况下都不会导致问题,但是搞砸生产数据库可能会花费很多。
进一步阅读
如果你想完成这个
- Resetting Entity Framework Migrations to a clean Slate
- Reset Entity-Framework Migrations
在我看来 collapsing_migrations 的风险不是_collapsing_migrations。
C - 崩溃迁移
风险:
- C_R1 - 结果数据库不是它应该的样子,因为:
- 创建摘要迁移时,单个迁移中的自定义更改会丢失
- 其他原因
- C_R2 - 部署风险:不简单的部署(包括修改 migration_history table)
好处:
- C_B1 - 重新创建数据库的代码启动速度更快(快多少?)
- C_B2 - 更清洁的解决方案
- C_B3 - 当前迁移包含在新数据库版本中弃用的操作
- C_B4 - (我不推荐这个,见下文)如果最初使用较新版本的 EF 完成,新版本的 EF 可能会创建更好 [=70=],甚至可能修复错误,或突出显示问题。
NC - 不折叠迁移
- NC_R3 - 迁移达到限制 - 高影响,不太可能,应在 PROD 之前检测到
无论如何...让我们这样做
我不推荐它,但如果您决定崩溃迁移,这里有两种方法可以降低风险 C_R1
(结果数据库 != 当前数据库,因为一些自定义代码是 'lost in translation' ).
一个。使用外部工具创建表示数据库的初始脚本,并使用生成的 sql
作为第一个新迁移的基础(而不是 运行 添加迁移并使用 EF 自带的代码达)。
乙。使初始迁移包含所有迁移的代码(而不是仅 运行 添加迁移并使用 EF 提供的代码)。