【问题标题】:Entity Framework Core migrations on multiple databases多个数据库上的 Entity Framework Core 迁移
【发布时间】:2022-12-09 02:23:18
【问题描述】:

我正在使用 EF core 和 SQL Server 创建一个 .NET 6 API,并尝试实现多个数据库,这些数据库将基于从身份令牌传入的 id 来使用不同的连接字符串。本质上,会有多个数据库,每个数据库都包含相同的表,但存储不同的信息。用户将能够从前端编辑数据,并根据他们正在使用的“租户”,将数据存储在适当的数据库中。目前,所有数据库都将位于同一台服务器上。

当用户发出请求时,我已经能够正确地实现它,在我的 DbContext 中使用以下内容:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if(!optionsBuilder.IsConfigured)
            {
                var tenantId = _httpContext.GetClaim("tenantId");
                optionsBuilder.UseSqlServer(GetClientConnectionString(tenantId));
            }
        }

GetClientConnectionString 函数将执行一些逻辑来操作默认连接字符串,并根据用户令牌中的 id 返回正确的值。这工作正常,当使用适当的令牌运行时,能够正常切换连接字符串。

我不确定的部分是如何单独维护每个数据库——是否有为每个数据库运行迁移的好方法?我知道可以将连接字符串传递给 dotnet ef migrations ... 命令,但是如果数据库数量增长到相当大的数量,这似乎效率不高。

硬着头皮手动执行迁移是最好的选择吗?或者是否有可能以某种方式循环遍历一组键,这些键将返回连接字符串值并将迁移应用于每个键?

我对 EF 中的简单数据集以外的任何东西都比较陌生,所以我希望我不仅仅是遗漏了一些东西。

提前致谢

【问题讨论】:

  • 您的所有数据库都只使用一个后端吗?
  • 是的,它只会是一个后端

标签: c# entity-framework-core .net-6.0


【解决方案1】:

我从来没有这样做过,但是您可以尝试使用一个 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2011-01-12
    • 1970-01-01
    • 2019-02-12
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多