19

我想知道我是否可以完全自动化代码优先迁移以实现持续集成。

目前我的持续集成只是简单地更新代码更改,但是,我手动生成迁移,并更新我的持续集成服务器上的数据库。

生成迁移并自动更新数据库是否可靠/可能/推荐?

例如:

我有属性 userId 和用户名的用户。然后我将属性年龄添加到代码中。当前方案需要我创建一个迁移来捕获此更改,然后我将我的更改签入到版本控制中。持续集成将发现这种变化,并将部署新版本。我必须手动更新数据库(应该是自动化的)。

我是否也可以跳过迁移的生成,这样我可以简单地将属性年龄添加到代码中,持续集成将生成此迁移。不确定这是否被推荐。

4

2 回答 2

6

答案是肯定的,但不是你描述的那样。

您必须并且应该手动生成迁移。并非所有迁移都可以自动创建,在这些情况下,需要手动修改生成的迁移。列拆分、某些类型的数据类型更改等。

然后,您的 CI 服务器可以利用 migrate.exe 使您的数据库与您的模型同步。棘手的部分是处理导致降级的迁移。所以从 v1 到 v2 很容易,但从 v2 回到 v1 比较棘手,因为只有 v2 程序集知道如何“回到”到 v1。

我最终创建了一个自定义工具,它智能地执行迁移并自动确定要用于迁移的模型(上下文)程序集。您可以在此处了解如何执行此操作:EF Code First Migrations to Deploy Older Version

最终结果是我可以签入模型更改/迁移,并且知道我的数据库更改将自动部署到属于我的 ci/cd 管道的任何环境 - 是的,这绝对包括生产。

于 2014-07-12T02:42:55.347 回答
0

如果他们没有通过测试,持续集成的一部分也有可能回滚错误的更改。

  • 您是否以可以降级的方式编写数据库升级脚本?
  • 您是否为每次提交创建一些保存点或备份?
  • 如果备份/还原错误提交,您会丢失数据库中的数据吗?
  • DDL 本身有什么不好的变化?

这些是您在实施之前应该考虑的一些问题。

于 2014-04-16T09:05:16.613 回答