【发布时间】: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,那么它应该代表“打包订单”工作单元
标签: c# entity-framework .net-core entity-framework-core