c# - 实体框架添加记录而不检查它是否存在或已添加
问题描述
我有一个大型 CSV 文件,我需要从中将项目添加到数据库(超过一百万行)。我已经对原始 csv 进行了分块,以将行条目一次限制为 1000 行。我已经尝试了一些添加到 Db 的逻辑
var modelObjects = new List<ModelObject>();
... add 1000 rows to modelObjects
context.ModelObjects.AddRange(ModelObjects);
context.SaveChanges();
... repeat until all data is added to db
我知道的任何方法都会使 EF 跟踪 Id 并查找重复项并减慢添加过程。我想要一种方法,我可以简单地添加范围而不检查重复项。如果AddingRange 发生冲突,只需替换该项目。
就像是
context.ModelObjects.AddRange(ModelObjects) --force --ignoreduplicatecheck
解决方案
正如您所观察到的,当行包含 id 时,批量添加行非常慢,因为实体框架别无选择,只能检查每个 id 是否已经存在。
如果您希望使用实体框架尽可能快地批量添加行(可能仍然比您的要求慢,但这还有待观察),那么您必须确保您的 id 列是自动的- 由实体框架生成,并避免在每个批量插入的行中指定 id 的值。这样,实体框架将自己生成唯一的 id,因此根据您使用的数据库,它可能能够批量插入您的行,而无需检查每个 id 是否已经存在。
如果您的批量插入的行已经有一些您想要做一些有意义的事情的 id,您可能希望将这些 id 存储在id2
没有索引的单独列(例如,)中,因此它不会减慢您的批量插入,并在批量插入完成后执行额外的查询,以查找重复项、将它们与现有行合并等。
推荐阅读
- linux - 如何在Linux bash中为每个用户在一行中显示组下的用户
- amazon-web-services - 我们可以将每个值从设备影子单独更新到 api 网关吗?如果是这样,怎么做?(通过期望的状态更新2个或多个值)
- sql - 将多行组合成一列并找出差异
- angular - @Input() 变量说对象可能在 Angular 中未定义
- python - numpy 将 ND 数组转换为 (N-1)D 数组的列表,无需循环
- jquery - 如何为缩略图 Woocommerce 创建滑块
- javascript - 通过前端解决严格起源时跨起源错误
- android - Logcat 显示 -W System.err: mkdir failed: EEXIST (File exists) : /data/user/0/com.app.name/cache/WebView/Crash Reports
- mysql - MySQL Update Condtional for Three columns Between Two DBs
- java - 如何在arraylist中查找具有计数和重复值总数的重复值