EF核心迁移 - 多个数据库



是否可以在具有相同表格的多个数据库上运行EF核心迁移。这是针对有一个主数据库的多租户体系结构(具有所有租户数据库的元数据,包括租户数据库连接字符串)和一个具有相同数据库对象的租户的一个数据库。当在SaaS模型中自动创建新的租户数据库时,我们需要能够运行这些迁移,并且只要对数据库结构进行更改(新列,数据类型更改,新索引等),也可以运行这些迁移。

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

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

在运行时执行迁移很容易。您可以在应用程序启动时为每个连接字符串实例化DBContext(如果是Webhost.run()之前,则可以执行这样的迁移: dbcontext.database.migrate();

当然,这不是理想的,因为它使您更难使用Visual Studio Package Manager Console或CLI使用 dotnet ef ef 命令。

可以为CLI命令提供连接字符串。因此,您可以每个dB运行一次,为每个db提供连接字符串。

命令看起来像这样:
dotnet ef database update --connection "Server=client1.db;Database=client1"

我们的团队有大约10个开发人员,我们的应用程序是一个前端连接到20个数据库(同一方案),并且在有新客户端时将添加新的数据库。有时有人需要更新数据库方案,我们最终会这样做。

  • 如果您需要更改方案,请创建SQL脚本并通过电子邮件创建更改请求
  • 团队中只有一个人运行这些脚本,然后更新数据库访问层
  • git push
  • 告诉团队晚餐准备就绪

这样做的人创建了一个用于数据库迁移的EXE项目,他一直在文件夹中添加脚本,因此该文件夹将包含所有脚本

0001.InitTables.sql
0002.MoreTabels.sql
0003.UpdateDropdowns.sql
.
.
.

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

他将首先为开发服务器运行,在发布日期,他将运行此产品。

  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();
    }
    

最新更新