我对实体框架有疑问,希望有人能提供帮助:)
我正在尝试实现的功能:我的应用程序应该能够从第三方应用程序获取 XML 转储,查看数据并与应用程序数据库中的内容进行比较,并根据重要标准更新任何实体,这基于实体的 XML 版本和 DB 版本。
方法:将所有数据加载到内存(数据库的EF)并在内存中进行所有比较并将更新写回数据库。
方法背景(可选阅读):我工作的客户之前曾多次遇到过此类问题,并且从未对他们之前找到的解决方案感到满意。他们得出的结论是,这是最好的方法。所以我现在不是在寻找替代解决方案,而是要么找出如何做到这一点,要么确信它无法在合理的时间内完成。
我的问题:将 XML 加载到内存中没有问题,从数据库加载更是如此。问题的核心是数据存储在 8 个有连接的表中,主表有近 500 000 行。结果是返回大量数据的复杂查询。我尝试了几种方法:
1)只需将其全部加载到来自 SQL Server 的一个大请求中。似乎在阅读时找到了一段时间,直到它使用大约 1.6 GB 的 RAM,当我得到 OutOfMemoryException - 即使有近 10 GB 的可用 RAM。异常来自 EF 内部。在异常发生时,大约一半的记录已被读取。
2)使用 Skip/Take 逐段阅读。需要 OrderBy,所以我按主表的主键排序(int,顺序但不是自动增量)。这使查询变得更加复杂,最后有 15 多个 ORDER BY 语句,其中大约 5 个是实际作为我排序依据的主键副本的列。不知道为什么有这么多副本,但它们就在那里......查询超时 - 当然。
3)从主表中选择所有主键,排序。然后取前 1000 个并创建一个包含这 1000 个中最小和最大的限制对。对所有 1000 个组重复直到完成。现在多次调用查询,检查每对中两个数字之间的主键,以一次加载集合 1000。结果证明这非常慢——每组 1000 人需要 45 秒,这远远不能接受。
选项1似乎最接近工作,但 EF 内部似乎存在内存限制。有可能以某种方式调整它吗?
我正考虑放弃 EF 来完成这项任务(即使它在其他地方的整个应用程序中都使用过),但我想我会给你这个问题先咀嚼 ;-)