是否可以在具有相同表格的多个数据库上运行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();
}