[英]Entity Framework Core migrations on multiple databases
我正在创建一个 .NET 6 API 使用 EF 核心和 SQL 服务器,并尝试实现多个数据库,这些数据库将根据从身份令牌传入的 id 使用不同的连接字符串。 本质上,会有多个数据库,每个数据库都包含相同的表,但存储不同的信息。 用户将能够从前端编辑数据,并根据他们正在使用的“租户”,将数据存储在适当的数据库中。 目前,所有数据库都将位于同一台服务器上。
当用户发出请求时,我已经能够正确地实现它,在我的 DbContext 中使用以下内容:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if(!optionsBuilder.IsConfigured)
{
var tenantId = _httpContext.GetClaim("tenantId");
optionsBuilder.UseSqlServer(GetClientConnectionString(tenantId));
}
}
其中GetClientConnectionString
function 将执行一些逻辑来操作默认连接字符串并根据用户令牌中的该 ID 返回正确的值。 这工作正常,当使用适当的令牌运行时,能够正常切换连接字符串。
我不确定的部分是如何单独维护每个数据库——是否有为每个数据库运行迁移的好方法? 我知道可以将连接字符串传递给do.net ef migrations...
命令,但是如果数据库数量增长到相当大的数量,这似乎效率不高。
硬着头皮手动执行迁移是最好的选择吗? 或者是否有可能以某种方式循环遍历一组键,这些键将返回连接字符串值并将迁移应用于每个键?
我对 EF 中的简单数据集以外的任何东西都比较陌生,所以我希望我不仅仅是遗漏了一些东西。
提前致谢
我从来没有这样做过,但是您可以尝试使用一个 DbContext 开始迁移所有数据库(说基础是相同的),只需尝试更改每个数据库的连接字符串即可。 我没有时间测试它,但我希望它会起作用
foreach (var connection in ConnectionList)
{
var optionBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionBuilder.UseSqlServer(connection);
using var dbContext = new ApplicationDbContext(optionBuilder.Options);
var pendingMigrations = await dbContext.Database.GetPendingMigrationsAsync();
if(pendingMigrations.Any())
{
await dbContext.Database.MigrateAsync();
}
await dbContext.DisposeAsync();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.