.NET Core登录后动态获取连接字符串接入企业专属数据库实现咨询
.NET Core 动态多租户数据库连接实现方案
核心逻辑
基于工厂模式实现租户专属DbContext的动态创建,不需要在Startup.cs中提前注册所有企业的连接字符串,仅提前注册公共库的固定DbContext即可。
具体实现步骤
- 公共库静态注册:将公共数据库的连接串固定配置在appsettings.json中,在Startup.cs中正常注册公共库对应的DbContext,用于登录阶段查询用户所属企业信息及对应connecting string。
- 租户DbContext工厂封装:自定义租户DbContext工厂接口及实现类,支持传入连接字符串实时生成租户DbContext实例,无需提前在容器中注册。
- 登录逻辑集成:登录验证通过、拿到企业对应的连接字符串后,调用工厂生成租户DbContext,直接执行
DbContext.Database.Migrate()即可。EF Core自带的Migrate方法会自动检测未执行的迁移脚本,表已存在时不会重复创建,完全匹配你的需求。 - 后续请求复用:登录成功后将连接字符串加密存入JWT的Claim或分布式缓存(Key绑定企业ID/用户ID),后续接口请求时从Claim或缓存中取出连接串,即可通过工厂获取对应租户的DbContext进行数据操作。
Swagger适配说明
该逻辑完全适配Swagger,无需做特殊调整:
只需按常规配置Swagger的JWT授权支持,在Swagger调试时先调用登录接口获取Token,在Swagger顶部的授权栏填入Token后,后续请求的动态连接逻辑和普通接口请求完全一致,不影响Swagger的调试和文档展示。
核心代码示例
租户专属DbContext定义
public class TenantDbContext : DbContext { public TenantDbContext(DbContextOptions<TenantDbContext> options) : base(options) { } // 企业专属数据表对应的DbSet public DbSet<Product> Products { get; set; } }
租户DbContext工厂定义
// 工厂接口 public interface ITenantDbContextFactory { TenantDbContext CreateDbContext(string connectionString); } // 工厂实现 public class TenantDbContextFactory : ITenantDbContextFactory { public TenantDbContext CreateDbContext(string connectionString) { var optionsBuilder = new DbContextOptionsBuilder<TenantDbContext>(); // 此处替换为你使用的数据库驱动,比如UseMySql、UseNpgsql等 optionsBuilder.UseSqlServer(connectionString); return new TenantDbContext(optionsBuilder.Options); } }
启动类中注册工厂
在Startup.cs的ConfigureServices方法中注册工厂即可:
services.AddScoped<ITenantDbContextFactory, TenantDbContextFactory>();
登录方法中调用示例
// 登录校验通过后,从公共库查询当前用户所属企业的连接串 var enterpriseConnStr = _publicDbContext.Enterprises .FirstOrDefault(e => e.Id == loginUser.EnterpriseId) ?.ConnectionString; if (string.IsNullOrWhiteSpace(enterpriseConnStr)) { // 抛出对应业务异常即可 throw new CustomException("未找到所属企业的数据库配置"); } // 生成租户DbContext并执行迁移 using var tenantDbContext = _tenantDbContextFactory.CreateDbContext(enterpriseConnStr); tenantDbContext.Database.Migrate();
内容的提问来源于stack exchange,提问作者Mehmet BEDEN
相关产品推荐
相关产品推荐

