【问题标题】:Entity Framework datareader already open nested entity loop实体框架数据读取器已打开嵌套实体循环
【发布时间】:2010-11-13 17:53:21
【问题描述】:

我从数据库中检索了两个实体列表,它们使用相同的上下文和相同的连接字符串。当我从上下文中获取它们时,它们具有导航属性,并且这些加载很好,即IQueryable<EntityA> A = context.EntityA.Include("V"), IQueryable<EntityB> B = context.EntityB.Include("V")

有一个嵌套循环,即

foreach(EntityA a in A) {
  foreach (EntityB b in B) { 
    if (b.V.property == a.V.property) {
      // do something 
    } 
  }
}

当它在此循环中到达 EntityB 时,会引发数据读取器已打开的异常。我理解为什么会发生这种情况,因为它们共享相同的连接字符串和conetext,但是我不确定解决方案是什么。 谢谢

【问题讨论】:

  • 如果你写更多关于连接问题的代码会更好:)

标签: c# entity-framework-4


【解决方案1】:

我不确定您的数据访问模式是什么(存储库模式等...),但我会尝试在“foreach”循环之前的某个地方进行迭代,并从内存中迭代循环。您可以使用简单的ToList() 而不是循环遍历IQueryable<T>

您可以直接查询到列表或将 IQueryable 带入的任何位置,只需在末尾添加到列表即可。这就是我可以建议的所有内容,直到我看到更多代码。

【讨论】:

  • 我认为一旦你分配,IQueryable B = context.EntityB.Include("V"), 对象 B 将加载所有值,包括导航属性。我似乎必须将它存储在一个列表中, List BList = B.ToList().
  • IQueryable 是一个接口,它将保存“查询”直到它在视图中被枚举,foreach 循环、.Any().ToList() 等...
  • 使用 IQueryable 有其一席之地,因为 EF 将尝试将所有“查询”组合在最好的单个事务中,并且与昂贵的查询和事务相同。但是,您只需要注意实际枚举查询的时间。
猜你喜欢
  • 2018-06-10
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2018-01-27
  • 2023-03-08
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多