Entity Framework:此命令已关联一个必须先关闭的打开的DataReader

12

我有下面这段代码,用于从客户表中检索数据

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();

执行Mapper函数时出现错误信息:此 Command 已经与打开的 DataReader 相关联,必须先关闭它

现在我知道要解决这个问题,我必须在连接字符串中设置multipleactiveresultsets=True。我已经尝试过,并且成功地解决了我的问题。

然而,当我运行 SQL 仿真器时,自动从实体框架查询所有客户也检索了所有地址,即使我并不需要它们。

除了必须设置multipleactiveresultsets=True以外,是否有其他解决方法? 我不想一直懒加载地址。


在这里展示你的代码之前,你可能需要检查一下它,我敢打赌你的代码被触发之前有另一个上下文处于活动状态。 - Middas
我没有其他活动的上下文。 - Null Reference
丹,你可能有点头绪了。让我试试看。 - Null Reference
1个回答

14

我认为这是因为对于每个顾客,选择语句会导致再次去读取数据库。为什么不先使用ToList(),然后应用映射(Select),类似于:

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

我相信这将首先获取数据,然后进行映射,这样您就不会遇到那个问题。


14
如果你处理大量数据,将整个集合转化为内存中的数据是一个非常糟糕的想法。如果可以避免,你应该尽量避免这样做。 - Henry
5
除非你有一些积极的贡献,比如提供一个替代方案,否则降低评分有点毫无意义。 - JazziJeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接