C#中如何配置多个数据库连接?如何切换连接?

来源:这里教程网 时间:2026-02-21 17:27:13 作者:

在C#中配置和切换多个数据库连接,通常通过配置文件管理连接字符串,并在运行时根据需要选择对应的连接。以下是具体实现方式。

配置多个数据库连接字符串

在项目根目录的 appsettings.json(.NET Core/.NET 5+)或 web.config / app.config(传统.NET Framework)中定义多个连接字符串。

appsettings.json 为例:

{
  "ConnectionStrings": {
    "DefaultDb": "Server=localhost;Database=MyAppDb;User Id=sa;Password=123;",
    "ReportingDb": "Server=localhost;Database=Reports;User Id=sa;Password=123;",
    "AuditDb": "Server=localhost;Database=AuditLog;User Id=sa;Password=123;"
  }
}

Program.csStartup.cs 中注册这些配置:

builder.Services.Configure<DbContextOptionsBuilder>(options =>
{
    // 配置不同的 DbContext 使用不同连接
});

为不同数据库创建独立的 DbContext

每个数据库建议使用单独的 DbContext 类,便于管理和切换。

public class DefaultContext : DbContext
{
    public DefaultContext(DbContextOptions<DefaultContext> options) : base(options) { }
    // DbSet...
}
public class ReportingContext : DbContext
{
    public ReportingContext(DbContextOptions<ReportingContext> options) : base(options) { }
    // DbSet...
}

Program.cs 中注册服务:

builder.Services.AddDbContext<DefaultContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultDb")));
builder.Services.AddDbContext<ReportingContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("ReportingDb")));

运行时动态切换数据库连接

如果需要在同一个 DbContext 类型下切换不同数据库(比如租户场景),可以在创建实例时传入不同的连接字符串。

示例:手动创建 DbContext 实例

var options = new DbContextOptionsBuilder<DefaultContext>()
    .UseSqlServer(connectionString)
    .Options;
using var context = new DefaultContext(options);
// 执行数据库操作

可以根据业务逻辑判断使用哪个连接:

根据用户角色、租户ID、环境变量等决定连接目标 封装一个工厂类来创建对应上下文
public class DbContextFactory
{
    private readonly IConfiguration _configuration;
    public DbContextFactory(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    public DefaultContext CreateForTenant(string tenantId)
    {
        var connStr = tenantId switch
        {
            "A" => _configuration.GetConnectionString("DefaultDb"),
            "B" => _configuration.GetConnectionString("ReportingDb"),
            _ => throw new ArgumentException("未知租户")
        };
        var options = new DbContextOptionsBuilder<DefaultContext>()
            .UseSqlServer(connStr)
            .Options;
        return new DefaultContext(options);
    }
}

注入该工厂并在服务中使用:

var context = dbContextFactory.CreateForTenant("A");
var data = context.Users.ToList();

使用依赖注入配合策略模式(高级用法)

对于复杂系统,可结合 IHttpContextAccessor 或自定义解析逻辑,在请求开始时决定使用哪个数据库。

也可以实现一个抽象的数据访问层,运行时注入对应实例。

定义接口 IDbContext 根据不同条件注册不同实现 利用容器解析正确实例

基本上就这些。关键是把连接字符串管好,用不同的 DbContext 或运行时传参来实现切换。不复杂但容易忽略配置细节。

相关推荐