2013-04-17 29 views
10

我有下面的代码从一个客户表的EntityFramework已经有与此命令相关联的打开的DataReader,必须先关闭

var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList(); 

的映射函数检索数据,映射实体对象,一个企业对象,它看起来像这样

internal static Customer Map(CustomerEntity entity) 
    { 
     if (entity == null) 
      return null; 

     return new Customer 
     { 
      Id = entity.Id, 
      Name = entity.Name, 
      Addresses = Map(entity.Addresses) 

     }; 
    } 

现在,上面的代码运行良好。

然而,当我尝试这样做:

var customers= context.CustomerEntities.Select(Mapper.Map).ToList(); 

我得到的错误信息:There is already an open DataReader associated with this Command which must be closed first正在执行的映射功能时。

现在我知道要解决这个问题,我必须在我的连接字符串中设置multipleactiveresultsets=True。我试过了,它确实解决了我的问题。

但是,当我运行SQL事件探查器时,查询所有来自实体框架的客户也会自动检索所有地址,即使我不需要它们。

除了必须设置multipleactiveresultsets=True之外,还有一种解决方法吗?我不想让地址一直被加载。

+0

您可能希望在您的示例之前检查您的代码,我敢打赌,在您的代码被解雇之前,您还有另一个上下文激活。 – Middas

+0

不,我没有另一个活动的上下文 –

+0

丹,你可能会做些什么。让我试试 –

回答

11

我认为这是因为对于每个Customer select语句导致再次读取数据库。你为什么不先做ToList()然后应用映射(Select)是这样的:

var customers= context.CustomerEntities.ToList().Select(Mapper.Map); 

我相信这会首先将数据,然后进行映射,你不会有问题。

+12

这样做会将整个集合物物化成内存,如果你处理大量数据是一个非常糟糕的主意,如果你可以避免它应该。 – Henry

+2

由于上面提到的原因而被降低。 –

+2

除非你有积极的贡献,也就是替代品,否则有点毫无意义的downvoting .... – JazziJeff

相关问题