Entity Framework 多个实例的迁移策略

Entity Framework migration strategy for multiple instances

我有一个 .NET 核心应用程序,我在 AWS Elastic Container Services (ECS) 上 运行。 - 该应用程序在两个不同的实例上运行。 - 数据库是 SQL 服务器

该应用程序在启动时运行数据库迁移,效果非常好。但是后来我不得不迁移大量数据,这意味着迁移需要更长的时间。这导致被移动的数据重复。

发生这种情况是因为两个应用程序首先检查数据库是否已执行迁移,都发现它没有执行,然后都开始 运行 迁移需要时间。完成后,它将迁移添加到数据库中。

人们如何解决这个问题?

我和其他人想到的可能解决方案

  1. 从只有一个应用程序实例开始,然后扩大规模。 这可行,但每次进行迁移时,我都必须手动缩小和放大。 (可以自动完成,但需要时间)

  2. 在事务中包装长 运行 迁移,并在开始时将迁移设置为在数据库中完成。在提交更改之前检查它是否在数据库中。如果事务失败,从数据库中删除迁移。

  3. 锁定数据库? 。好像很奇怪。

  4. 使迁移成为部署过程的一部分。这似乎是最佳实践,但这意味着构建服务器需要知道数据库机密。我不怕给它,但这意味着我将不得不维护一个重复集。

外面的人做什么?我是否遗漏了一些明显的解决方案?

谢谢

我们过去也让我们的应用程序执行迁移,但即使是 Microsoft recommends avoiding this 在多实例环境中:

We recommend production apps should not call Database.Migrate at application startup. Migrate shouldn't be called from an app in server farm. For example, if the app has been cloud deployed with scale-out (multiple instances of the app are running).

Database migration should be done as part of deployment, and in a controlled way.

就像所有事情一样,解决问题的方法也各不相同。我们的团队很小,因此我们通过 EF CLI 工具生成迁移脚本,然后 运行 作为 deployment/maintenance 例程的一部分手动生成它们。如果您的流程允许,这当然可以自动化。