实体框架c#:循环中AddRange时的错误

本文关键字:AddRange 错误 循环 框架 实体 | 更新日期: 2023-09-27 18:00:02

我有200万个"pb"对象实例。我想把它添加到我的数据库中。由于内存的原因,我将我的对象列表拆分为列表集合,在"for"循环中,我试图在每次迭代中将10’000个对象实例添加到数据库中。

这是我的代码

 for (int i = 0; i < splittedList.Count; i++)                    
 {                         
    using(MyEntities db = new MyEntities()) //DB context                            
    {                         
    List<pb> outputPBs = splittedList[i];                        
    db.pb.AddRange(outputPBs);
    db.SaveChanges();
    }
}

不幸的是,第一次迭代添加了10’000个实例,但下一次迭代添加的是10’370个实例,而不是10’000。这个错误一直传播到最后一次迭代。

我做了一个长时间的调试:我用AddRange添加了正确的列表,但是db.pb.Local在执行AddRange后包含10’370个对象。

这额外的370个对象是来自上一次迭代的实例。

你能帮我吗?

这是一个代码,我用它来分割一个列表:

public static List<List<object>> Split(List<object> source)
{
    return  source
        .Select((x, i) => new { Index = i, Value = x })
        .GroupBy(x => x.Index / 3)
        .Select(x => x.Select(v => v.Value).ToList())
        .ToList();
}

编辑:完成

我解决了一个问题。问题与一对多的关系有关。我创建了树数据结构,并在不同于树枝和树叶的上下文中添加了根

实体框架c#:循环中AddRange时的错误

当你在每次迭代中都创建一个新的时,就上下文而言,如何从上一次迭代中"遗留"370个对象是没有意义的。

你完全确定你的分割是正确的吗?

List<pb> outputPBs = splittedList[i];

你是说输出PB吗。计数=10000?

额外的370个对象实际上是PB吗?或者这些PB中的任何一个是否包含与可能添加到对象计数中的其他对象的关系?