我已经看过很多“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();
}
Entity Framework此时为每个子项创建一个单独的insert语句。这需要50秒左右。我希望能够使用db.ChildEntity.AddRange(items)
但是我不确定是否有比使用2个单独操作更好的方法。首先创建父项以获取它的ID,然后创建所有子项的AddRange
?
答案 0 :(得分:0)
恕我直言您不需要先按顺序添加父项以插入子项目。你可以一次性做到这一点。
您可以在EF 5中尝试此操作AddRange
仅适用于EF 6
或更高版本。
这不会批量插入商品会生成查询并一次性插入
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;
}