有没有一种方法可以在具有相同表集的多个数据库上运行EF Core迁移。这是为多租户架构而设计的,其中有一个主数据库(具有所有租户数据库的元数据,包括租户数据库连接字符串),每个租户都有一个具有相同数据库对象集的数据库。我们需要能够在SaaS模型中自动创建新的租户数据库时运行这些迁移,并在数据库结构发生更改时(如新列、数据类型更改、新索引等)运行这些迁移。
有没有一种方法可以在具有相同表集的多个数据库上运行EF Core迁移。这是为多租户架构而设计的,其中有一个主数据库(具有所有租户数据库的元数据,包括租户数据库连接字符串),每个租户都有一个具有相同数据库对象集的数据库。我们需要能够在SaaS模型中自动创建新的租户数据库时运行这些迁移,并在数据库结构发生更改时(如新列、数据类型更改、新索引等)运行这些迁移。
我已在EF Core的GitHub上发布了完全相同的问题。
答案是,在设计时无法完成。您基本上需要在每个租户的数据库上手动运行迁移脚本。
但是,在运行时执行迁移非常容易。您可以在应用程序启动时(如果是Web应用程序,则在WebHost.Run()之前)为每个连接字符串实例化一个dbContext,并像这样执行迁移:dbContext.Database.Migrate();
当然,这并不理想,因为它使您难以使用Visual Studio Package Manager控制台或使用dotnet ef命令回滚到某个特定点。
CLI命令可以提供连接字符串。因此,您可以为每个数据库运行一次该命令,并为每个数据库提供连接字符串。
该命令如下所示:
dotnet ef database update --connection "Server=client1.db;Database=client1"
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();
}