首页 > 解决方案 > 实体框架添加记录而不检查它是否存在或已添加

问题描述

我有一个大型 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

标签: c#sql-serverentity-frameworklarge-data

解决方案


正如您所观察到的,当行包含 id 时,批量添加行非常慢,因为实体框架别无选择,只能检查每个 id 是否已经存在。

如果您希望使用实体框架尽可能快地批量添加行(可能仍然比您的要求慢,但这还有待观察),那么您必须确保您的 id 列是自动的- 由实体框架生成,并避免在每个批量插入的行中指定 id 的值。这样,实体框架将自己生成唯一的 id,因此根据您使用的数据库,它可能能够批量插入您的行,而无需检查每个 id 是否已经存在。

如果您的批量插入的行已经有一些您想要做一些有意义的事情的 id,您可能希望将这些 id 存储在id2没有索引的单独列(例如,)中,因此它不会减慢您的批量插入,并在批量插入完成后执行额外的查询,以查找重复项、将它们与现有行合并等。


推荐阅读