EF插入具有大量新子实体的实体

本文关键字:实体 插入 EF | 更新日期: 2023-09-27 18:29:04

我看到了许多"在EF中批量插入"问题,但所有这些问题都涉及用户试图插入大量项目的用例。

我有一种情况,我有一个新的Parent实体,它附加了大约1500个新的相关实体。父实体和子实体都映射到EF中各自的表。

目前我使用的是:

//p is already created and contains all the new child items    
public void SaveBigThing(Parent p){
  if(p.Id == 0){
    // we've got a new object to add
    db.BigObjects.Add(p);
  }
  db.SaveChanges();
}

实体框架目前为每个子项创建一个单独的插入语句。这需要50秒左右。我希望能够使用db.ChildEntity.AddRange(items),但我不确定是否有比使用两个单独的操作更好的方法。首先创建父项以获取其Id,然后为所有子项创建AddRange

EF插入具有大量新子实体的实体

IMHO您不需要先添加父项才能插入子项。你可以一次搞定。

您可以在EF 5中尝试此操作。AddRange仅在EF 6或更高版本中可用。

这不会批量插入项目,它将生成查询并一次性插入

Ef批量插入参考

另一个参考

public bool InsertParent(Parent parentObject)
{   
    //Assuming this is the parent table
    db.BigObjects.Add(parentObject);
    InsertChilds(parentObject); //Insert childs
    db.SaveChanges();
}
public bool InsertChilds(Parent parentObject)
{
    // This will save more time . 
    DataContext).Configuration.AutoDetectChangesEnabled = false;
    foreach(var child in parentObject.Childs)
    {
        //This will set the child parent relation
        child.Parent = childParent;
        db.ChildEntity.Add(child);
    }
    DataContext).Configuration.AutoDetectChangesEnabled = true;
}