Skip to content
Go back

在单个应用中使用多个 EF Core DbContext

Published:  at  12:00 AM

在单个应用中使用多个 EF Core DbContext

为什么要使用多个 DbContext

在多数 .NET 应用中,我们往往只使用一个 DbContext 来管理与数据库的交互。但在一些特定场景下,使用多个 DbContext 不仅是可行的,还能带来架构与性能上的好处。

1. 多数据库支持 当应用需要同时访问多个 SQL 数据库时,必须为每个数据库配置独立的 DbContext,从而实现物理上的连接隔离。

2. 分离关注点 复杂领域模型的应用中,可以将不同的业务域拆分到多个 DbContext 中。例如,CatalogDbContext 负责商品目录,而 OrderDbContext 处理订单与交易,从而降低模型复杂度。

3. 模块化单体架构(Modular Monolith) 通过为每个模块分配单独的数据库 Schema,可以在物理数据库层面实现逻辑隔离,有助于模块间的独立演化。

4. 读写分离与性能优化 在高并发场景下,可为只读操作配置访问数据库只读副本的 DbContext,并通过设置 QueryTrackingBehavior.NoTracking 提升查询性能。


如何在单个应用中配置多个 DbContext

以下示例展示了如何在一个应用中同时配置 CatalogDbContextOrderDbContext,它们共享同一个数据库,但使用不同的 Schema。

public class CatalogDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("catalog");
    }
}

public class OrderDbContext : DbContext
{
    public DbSet<Order> Orders { get; set; }
    public DbSet<LineItem> LineItems { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("order");
    }
}

Startup 或依赖注入配置中注册多个 DbContext:

services.AddDbContext<CatalogDbContext>(options =>
    options.UseSqlServer("CONNECTION_STRING"));

services.AddDbContext<OrderDbContext>(options =>
    options.UseSqlServer("CONNECTION_STRING"));

若使用不同的 Schema,还需为迁移历史表单独指定 Schema:

services.AddDbContext<CatalogDbContext>(options =>
    options.UseSqlServer(
        "CONNECTION_STRING",
        o => o.MigrationsHistoryTable(
            HistoryRepository.DefaultTableName,
            "catalog")));

services.AddDbContext<OrderDbContext>(options =>
    options.UseSqlServer(
        "CONNECTION_STRING",
        o => o.MigrationsHistoryTable(
            HistoryRepository.DefaultTableName,
            "order")));

多 DbContext 的限制与注意事项

  1. 跨 DbContext 不能直接 Join EF Core 无法在两个不同的 DbContext 间执行直接连接查询,即便它们指向同一数据库。

  2. 事务管理需共享连接 仅当多个 DbContext 连接同一数据库时,事务才能共享。需要通过 UseTransaction 手动共享事务对象。

  3. 迁移历史表 Schema 不自动继承 必须显式调用 MigrationsHistoryTable 指定迁移历史表的位置,否则 EF Core 会使用默认 Schema。


多 DbContext 带来的好处

在构建复杂、可扩展的 .NET 应用时,恰当利用多个 DbContext 能有效提升架构灵活性与可维护性。



Previous Post
全面解读 Playwright 端到端测试:工具、AI 与真实工作流
Next Post
Angular 20.2 稳定发布 Zoneless 模式,Signals 全面接管异步变更检测