【问题标题】:Is there a better way of .Core 3.1 many-to-many inserting.Core 3.1 多对多插入有没有更好的方法
【发布时间】:2020-11-16 11:13:49
【问题描述】:

我的客户正在上传 excel 文件以进行产品更新。每个 excel 文件有 50k+ 行,带有 ProductId 和多个 SpecId。

对于我正在做的每一行;

Product p = _context.Products.include(i => i.Specs).FirstOrDefault(x => x.Id == ExcelProductId);
Spec s = _context.Specs.FirstOrDefault(x => x.Id == ExcelSpecId);
p.Specs.Add(s);
_context.SaveChanges();

这会导致一些性能问题,并且代码确实与 25 多个规范相混淆。我们有更好的方法来做到这一点吗?就像只将 Id 值插入到 ProductSpec 多对多表中一样?也许使用 SqlBulkCopy 或 AdoNet?

我真的需要好的建议:(

谢谢!

【问题讨论】:

  • 嘿,你能分享一下你的数据库类是什么样子的吗?因为对于多对多关系,您通常有三个类。例如 Product、Spec,然后是第三个连接类,如 ProductSpec。
  • 就像只将 Id 值插入到 ProductSpec 多对多表中 -- 是的。
  • EF核心包含Bulk插入扩展,您可以尝试使用BulkInsert方法插入数据。更多详细信息,请查看以下链接:Bulk insertBulkInsert on Nested one-to-many relationshipEFCore.BulkExtensions
  • @ZhiLv-MSFT 不是 EF 核心。您指的是第三方软件。

标签: asp.net-core entity-framework-core many-to-many insert-update


【解决方案1】:

你可以

  1. 应用批处理,一次发送部分(例如,您读取 1000 行、插入它们、读取、再读取 1000 行等)。以异步方式执行此操作以不阻塞主 ui 线程(如果这是一个 gui 应用程序)。
  2. 使用bulk inserting 也可以使用bulk insert xml files。如果文件与您的表结构不完全匹配,您可以尝试先将所有内容插入到临时表中,然后运行 ​​sql 查询将数据复制过来。好像还有nuget packages
  3. 创建一个为此任务优化的自定义 sql 查询。您可以使用 Sql profiler 来深入了解 EF 生成的查询,并且应该有很多关于如何在线编写高效 SQL 查询的资源。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2020-12-11
    • 2016-02-04
    • 1970-01-01
    • 2017-06-10
    • 2012-06-02
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多