Entity framework 添加记录而不检查它是否存在或已经添加
Entity framework add record without checking if it exist or already added
我有一个很大的 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 时,批量添加行非常慢,因为 entity framework 别无选择,只能检查每个 ID 是否已经存在。
如果您希望使用 entity framework 尽可能快地批量添加行(这可能仍然比您的要求慢,但这还有待观察,)那么您必须确保您的 ID 列是由 entity framework 自动生成的,并且不要在每个批量插入的行中指定 ID 的值。这样,entity framework 将自行生成唯一的 ID,因此根据您使用的数据库,它可能能够批量插入您的行,而无需检查每个 ID 是否已经存在。
如果您的批量插入行已经有一些您想要做一些有意义的事情的 id,您可能希望将这些 id 存储在一个单独的列(例如,id2
)中,它没有被索引,所以它不会减慢你的批量插入,并在批量插入完成后执行额外的查询,以查找重复项,将它们与现有行合并等。
我有一个很大的 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 时,批量添加行非常慢,因为 entity framework 别无选择,只能检查每个 ID 是否已经存在。
如果您希望使用 entity framework 尽可能快地批量添加行(这可能仍然比您的要求慢,但这还有待观察,)那么您必须确保您的 ID 列是由 entity framework 自动生成的,并且不要在每个批量插入的行中指定 ID 的值。这样,entity framework 将自行生成唯一的 ID,因此根据您使用的数据库,它可能能够批量插入您的行,而无需检查每个 ID 是否已经存在。
如果您的批量插入行已经有一些您想要做一些有意义的事情的 id,您可能希望将这些 id 存储在一个单独的列(例如,id2
)中,它没有被索引,所以它不会减慢你的批量插入,并在批量插入完成后执行额外的查询,以查找重复项,将它们与现有行合并等。