【问题标题】:Fetch users list from 165 databases with 30 different DB schema using .NET CORE and EF [closed]使用 .NET CORE 和 EF 从 165 个具有 30 种不同数据库架构的数据库中获取用户列表 [关闭]
【发布时间】:2020-01-03 10:58:13
【问题描述】:

我正在构建一个 API,它将从 165 个具有 30 种不同数据库架构的数据库中获取用户列表

有些表可能有不同的名称,比如表User,它可以命名为UserUsersAspNetUsersApplicationUser

某些表中的字段可能具有不同的名称,即使它们包含相同的信息。如列UserId,可以在不同的架构中命名为userIduser_iduidid

我想从所有数据库中获取所有用户的列表(C# 属性:UserIdUserName),我怎样才能做到这一点?

目前,我的应用仅使用标准推荐配置连接到一个数据库。

【问题讨论】:

  • 您确定要为此使用 EF 吗?对于任何 ORM 来说,这似乎都是一个棘手的问题。无论如何,听起来您需要某种“翻译”层,它知道用于特定数据库的表和列名。
  • 也许这可以在数据库级别做得更好。如果您的数据库系统supports the concept 您可以为许多不同的表创建一个视图并从该视图中选择
  • 编写一个脚本,为所有 30 个不同的数据库创建代码。创建的代码对于每个数据库都是唯一的。然后使用该代码。换句话说,脚本会计算出字段名、表名并为每个字段编写一个选择查询。或者只是为每个db写代码,30个也不算多。
  • EF 是为此类工作想到的最后一个工具。使用 Dapper。
  • 关闭的原因之一是这里有太多的未知数。比如,是否有一些连接字符串的集合?是否事先知道哪个数据库具有哪个模式,或者代码应该先嗅出它?数据库提供者是否混合在一起?显然,这并不像对每个数据库运行 30 个预制查询中的一个那么简单。 OP 似乎在寻找更高级的东西。看到第一次努力将有助于了解 OP 的发展方向。

标签: c# entity-framework asp.net-core asp.net-web-api entity-framework-core


【解决方案1】:

要查询“165 个数据库,30 种不同的数据库架构”,首先要面对的是性能。你需要一个革命性的解决方案。

我曾为distributed 应用程序处理超重查询

当我们向 API 发送请求时(我们简称为 GetUsersCount()),API 将简单地使用 parallel tasks 向其他 API 发送许多子请求(在您的情况下为“165”请求),然后API GetUsersCount()concat 响应所有结果。因此 API GetUsersCount() 不执行任何查询,但 concat 结果。通过这种方式,我们将响应时间从 5-10 分钟减少到 1 秒。所以你需要在你的 API 后面添加一个layer(应该是另一个 RESTful API),该层将使用 EF 核心查询一个特定的数据库。

但就您而言,我想知道您的结果有多大?你会sort/group/paging 结果吗?但也可以通过以上想法进行更详细的设计来解决。

但是,如果您只有几个 DB(例如 2-3 个 DB),我建议将 Cross-database-queryunion 所有几个表使用 Linked-server 放在一个视图中,然后使用 Keyless-entity-type(Query-type) 到可见操作结果。 2个选项:

  1. 使用 EF Core 代码优先方法将 view 创建到当前连接的数据库,然后以表格形式访问视图。按照引用的帖子,你会达到的。
  2. 使用trigger(如果允许)将视图架构同步到您连接的数据库的一个唯一表。当数据不是很大并且您必须group, sort, paging 结果时,这是最好的。

【讨论】:

  • 谢谢大家,我处理了Databse层上数据库的差异,并使用了Dapper而不是EF。
猜你喜欢
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多