EF Core迁移 - 多个数据库

9

有没有一种方法可以在具有相同表集的多个数据库上运行EF Core迁移。这是为多租户架构而设计的,其中有一个主数据库(具有所有租户数据库的元数据,包括租户数据库连接字符串),每个租户都有一个具有相同数据库对象集的数据库。我们需要能够在SaaS模型中自动创建新的租户数据库时运行这些迁移,并在数据库结构发生更改时(如新列、数据类型更改、新索引等)运行这些迁移。

3个回答

4

我已在EF Core的GitHub上发布了完全相同的问题。

答案是,在设计时无法完成。您基本上需要在每个租户的数据库上手动运行迁移脚本。

但是,在运行时执行迁移非常容易。您可以在应用程序启动时(如果是Web应用程序,则在WebHost.Run()之前)为每个连接字符串实例化一个dbContext,并像这样执行迁移:dbContext.Database.Migrate();

当然,这并不理想,因为它使您难以使用Visual Studio Package Manager控制台或使用dotnet ef命令回滚到某个特定点。


这个能用于生产环境中更新所有数据库吗? - Endri
是的,绝对没问题。 我们一直在使用这种方法,在生产环境中应用数据库迁移于所有租户数据库。 - KenR
@KenR 那么,这种方法是否依赖于 iis 重启/刷新来更新租户数据库呢?(因为 Webhost.Run() 在 Program.c 中,只有在应用程序重新启动时才会执行,就像你所说的那样) - ibubi
不仅仅是重新启动/刷新,而是应用程序的初始启动。在您的代码部署到服务器后,作为启动例程的一部分,您的应用程序将执行所有DB迁移脚本。如果一切顺利,随后的应用程序重新启动将不会产生任何影响,因为所有DB迁移已经应用于所有租户数据库。 - KenR

2

CLI命令可以提供连接字符串。因此,您可以为每个数据库运行一次该命令,并为每个数据库提供连接字符串。

该命令如下所示:
dotnet ef database update --connection "Server=client1.db;Database=client1"


1
我们的团队有大约10名开发人员,我们的应用程序是一个前端连接到20个数据库(相同方案),当有新客户时会添加新的数据库。不时会有人需要更新数据库方案,我们最终会这样做。
  • 如果您需要更改方案,请创建SQL脚本并通过电子邮件创建更改请求
  • 团队中只有一人运行这些脚本,并更新数据库访问层
  • git push
  • 告诉团队晚餐已准备好
这位负责此项任务的人为数据库迁移创建了一个EXE项目,他不断将脚本添加到一个文件夹中,因此该文件夹将包含所有脚本。
0001.InitTables.sql
0002.MoreTabels.sql
0003.UpdateDropdowns.sql
.
.
.

然后他使用像DbUp(https://dbup.readthedocs.io/en/latest/)这样的库来帮助他跟踪这些脚本并在DB服务器上运行。

他将首先在DEV服务器上运行此脚本,在发布日期时,他将在生产环境中运行它。

  List<string> connectionStrings=new List<string>{
      "ConStr1","ConStr2", "ConStr3" 
    };
    foreach(var conStr in connectionStrings){
        var upgrader = DeployChanges.To
                .SqlDatabase(conStr)        
                .WithScriptsEmbeddedInAssembly(
                   Assembly.GetExecutingAssembly()
                 )
                .LogToConsole()
                .Build();
    
        var result = upgrader.PerformUpgrade();
    }
    

你是如何创建用于方案更改的脚本的呢?例如,你是否使用EF迁移,在包管理器控制台中为每个数据库实例生成脚本? - cpt.oneeye
我一直认为 EF 迁移不是一个好主意。
  1. 它只适用于开发人员,当你有数据库管理员时,它会成为一个问题。
  2. 此外,当 .NET 不是系统的唯一语言时,非 .NET 开发人员需要一种更新数据库的方法。
总之,它会产生限制,而且我从中得不到太多好处,其他解决方案对我来说更好。
- DanielZ
1
@ cpt.oneeye,我们不强制开发人员使用任何方法来创建SQL脚本,他们可以使用一些生成软件,也可以手写。 - DanielZ

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