在 EF Core 中使用多个 dbContext

Posted

技术标签:

【中文标题】在 EF Core 中使用多个 dbContext【英文标题】:Use multiple dbContext on EF Core 【发布时间】:2021-11-23 12:59:30 【问题描述】:

我正在一个带有 EF Core 的 dotnet Core Web API 应用程序中工作,该应用程序使用多个(至少两个)dbContext 将表访问到两个不同的 Sql Server 架构中。例如:

在 Sql Server 级别:

Schema 1:
  TableProducts
  TableSkus
  ...

Schema 2:
  TableCustomers
  ...

鉴于上述结构,我为每个表使用一个存储库。 E.i:ProductsRepository、SkuRepository、CustomersRepository 等。根据这些表所属的模式,我们在运行时设置正确的模式名称。到这里一切正常。

但是,架构 2 上的表(比如说 TableCustomer)需要访问架构 1 上其他表的数据。

我在互联网上进行了一些初步搜索/调查,以了解如何实现这一目标,但到目前为止还没有运气。

基本上,我想做的是在同一台服务器上从多个数据库中选择。在 SQL Server 上类似于:

SELECT C.a, C.b, P.c FROM Database1.Schema2.TablePCustomers C
INNER JOIN Database1.Schema1.TableProducts P
ON C.fkId = P.fkId
WHERE C.a == 'some id'

但在存储库级别

有没有人做过类似的事情?或者,如果您可以指出任何可以的文档。

【问题讨论】:

在多个数据库的情况下,可以从DB服务器端创建同义词表。然后将其映射为 EF 中的普通表。 您的存储库是什么样的?如果您使用的是实体框架,则您已经在工作单元上下文中使用存储库。 Entity Framework 已经为您提供了,无需进一步的努力。 如果您认为您的应用程序与数据库无关。这意味着忽略不同的数据库模式。您应该考虑域的边界上下文而不是数据库上下文。 听起来您不想要或不需要多个 DbContext。您应该在单个上下文中定义所有表。这样你就可以定义它们之间的导航/外键。 同意所有其他评论者;如果您将拥有多个上下文,则它们的范围应该与“您希望执行的操作的范围”相关,而不是与“销售模式或人力资源模式”等人为边界相关。如果订单处理上下文需要拉入 sales.orders 和处理订单的 hr.employee,那么这些就是它应该访问的表。如果履行上下文需要访问打包订单的 sales.product 数据、supplier.shipping 数据和 hr.employee,那么它应该代表“打包订单”工作单元 【参考方案1】:

要求 Schema 2 上的 Table(比如说 TableCustomer)需要访问 Schema 1 上其他表的数据。

现在您知道为什么不应该有很多不同的 DbContext。只需将所有表添加到单个 DbContext 中,如果您想为业务逻辑提供更集中的视图,您始终可以在业务逻辑和 DbContext 之间分层。

EG 如果您觉得拥有 ProductsRepository 很方便,它会简单地包装您的 DbContext 实例并提供对 IQueryable<Product> 的访问,以及其他便利方法。

【讨论】:

以上是关于在 EF Core 中使用多个 dbContext的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EF Core 中实例化 DbContext

EF Core Scaffold DbContext

在 EF Core DbContext 中,附加方法不起作用

在单元测试期间避免在EF Core 2.2中使用HasData Seed DbContext

有没有办法将已经打开的 MySQL 连接传递给 EF Core DbContext ?用于多线程目的

将 EF Core 搭建到现有 DbContext 的脚手架