繁体   English   中英

多个数据库上的 Entity Framework Core 迁移

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM