Entity Framework Core (EF Core)是 .NET 中一个流行的 ORM,可用于处理 SQL 数据库。EF Core 使用DbContext,它代表与数据库的会话,并负责跟踪更改、执行数据库操作以及管理数据库连接。

DbContext整个应用程序通常只有一个。
但是如果您需要多个 DbContext怎么办?
在本周的新闻通讯中,我们将探讨:
• 当你可能需要使用多个 DbContexts
• 如何创建多个 DbContext
• 使用多个 DbContext 有什么好处
让我们开始吧!
为什么要使用多个 DbContext?
在某些情况下使用多个 DbContext 会很有用。
多个数据库
您的应用程序需要使用多个 SQL 数据库吗?那么您就必须使用多个 DbContext,每个 DbContext 专用于特定的 SQL 数据库。
分离关注点
如果您正在构建的应用程序具有复杂的域模型,则您可能会通过在几个 DbContext 之间分离关注点来看到改进,其中每个 DbContext 负责域模型的特定区域。
模块化整体
当您构建模块化整体时,使用多个 DbContext 非常实用,因为您可以为每个配置不同的数据库模式DbContext,从而在数据库级别实现逻辑分离。
只读副本
您可以配置一个单独的DbContext实例来访问数据库的只读副本,并将其用于 DbContext只读查询。您还可以进行级别配置QueryTrackingBehavior.NoTracking以DbContext提高查询性能。
在单个应用程序中创建多个 DbContext
下面介绍如何轻松配置多个 DbContext。假设我们的应用程序中有一个CatalogDbContext和一个OrderDbContext。我们希望使用以下约束来配置它们:
两个 DbContext 使用同一个数据库
每个 DbContext 都有一个单独的数据库模式
public class CatalogDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
public class OrderDbContext : DbContext
{
public DbSet<Order> Orders { get; set; }
public DbSet<LineItem> LineItems { get; set; }
}
首先,我们需要使用 DI 容器来配置。您可以通过调用方法并指定要配置的内容,然后使用 SQL 提供程序特定的方法传递连接字符串来完成此操作CatalogDbContext。在本例中,我使用该方法连接到 SQL Server 。OrderDbContextAddDbContextDbContextUseSqlServer
using Microsoft.EntityFrameworkCore;
services.AddDbContext<CatalogDbContext>(options =>
options.UseSqlServer("CONNECTION_STRING"));
services.AddDbContext<OrderDbContext>(options =>
options.UseSqlServer("CONNECTION_STRING"));
如果您只想在同一个架构中使用这两个 DbContext,那么以上配置就足够了。现在,您可以将DbContext实例注入到应用程序中并使用它们。
但是,如果您想为每个配置不同的模式DbContext,那么您还需要覆盖该OnModelCreating方法并使用指定自定义模式HasDefaultSchema。
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");
}
}
多个 DbContext 的限制
无法在不同的DbContext实例之间进行连接,因为EF Core不知道它们是否使用同一个数据库
只有当 DbContext 使用同一个数据库时,事务才会起作用。你必须创建一个新的事务,并通过调用以下方法在 DbContext 之间共享它:UseTransaction
迁移历史表
如果您决定为每个表使用不同的模式DbContext,您会惊讶地发现默认模式并不适用于迁移历史记录表。
您需要通过调用该MigrationsHistoryTable方法并指定用于存储该上下文的迁移历史记录的表名和架构来进行配置。HistoryRepository.DefaultTableName在本例中,我使用了常量,但您也可以根据需要指定自定义表名。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
services.AddDbContext<CatalogDbContext>(options =>
options.UseSqlServer(
"CONNECTION_STRING",
o => o.MigrationsHistoryTable(
tableName: HistoryRepository.DefaultTableName,
schema: "catalog")));
services.AddDbContext<OrderDbContext>(options =>
options.UseSqlServer(
"CONNECTION_STRING",
o => o.MigrationsHistoryTable(
tableName: HistoryRepository.DefaultTableName,
schema: "order")));
使用多个 DbContext 的好处
使用多个 DbContext 可以为您的应用程序带来多种好处:
• 关注点分离
• 更好的性能
• 更多控制和安全
每个 DbContext 可以负责应用程序数据的特定子集,这有助于组织代码并使其更加模块化。
当您将数据访问分成多个 DbContext 时,应用程序可以降低争用风险并提高并发性,从而提高性能。
如果您使用多个 DbContext,则可以配置更精细的访问控制来提高应用程序的安全性。您还可以优化性能和资源利用率。
总之
在单个应用程序中使用多个 EF Core DbContext非常简单并且有很多好处。
对于准备就绪的应用程序,您可以配置单独的选项DbContext以默认关闭查询跟踪并获得更高的性能。
另外,如果您正在构建模块化整体,使用多个 DbContext 也是很实用的。您可以将 DbContext 配置为位于单独的数据库模式中,从而在数据库级别实现逻辑分离。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。