【问题标题】:Entity Framework c#: Bug when AddRange in loop实体框架 c#:循环中的 AddRange 时出现错误
【发布时间】:2014-06-11 07:20:23
【问题描述】:

我有 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 添加了正确的列表,但是在 AddRange 执行后 db.pb.Local 包含 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();
}

编辑:完成

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

【问题讨论】:

  • 这是否超出了某个阈值?使用较少的实例它不会这样做吗?您的 splittedlist 每个包含 10.000 个对象,对吧?
  • 我试图将一个列表拆分为 100 个实例的包,它的工作方式是:第一次迭代:添加了 100 个元素,表包含 100 个元素第二次迭代:添加了 200 个元素(100 个正确的和 100 个额外的), table 包含 300 个元素 第三次迭代:添加了 300 个元素(100 个正确和 200 个附加),table 包含 600 个元素在这种情况下,这些附加元素是先前插入的元素的副本。

标签: c# database frameworks entity addrange


【解决方案1】:

当您在每次迭代中创建一个新对象时,就上下文而言,如何从前一次迭代中“剩余”370 个对象是没有意义的。

您完全确定您的拆分工作正常吗?

List<pb> outputPBs = splittedList[i];

你是说 outputPBs.Count = 10,000 吗?

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

【讨论】:

  • 我已经附加了我用来拆分列表的要点拆分功能。是 - outputPBs.Count = 10000;额外的370个对象是PB,我认为有之前添加的PB的副本。 PBs 与 FN 有关系(许多 PBs 对一个 FN)。这可能是根本原因?
  • 在 db.pb.AddRange(outputPBs);检查上下文中的 PB 数量,如果是 370,那么你是对的,它们是 PB...检查有关系的 PB 数量(在 10,000 变成 10,370 中)...尝试使用 pb.Connection .Open() 和 pb.Connection.Close() 更好地管理它的上下文连接并防止任何池。
  • 应该是 db.Connection.Open() 和 db.Connection.Close()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多