c# – entityframework已经有一个与此Command关联的打开的DataReader必须先关闭

前端之家收集整理的这篇文章主要介绍了c# – entityframework已经有一个与此Command关联的打开的DataReader必须先关闭前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码从客户表中检索数据
var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList();

mapper函数将实体对象映射到业务对象,它看起来像这样

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

我收到错误消息:已经有一个打开的DataReader与此命令关联,首先必须关闭Mapper函数执行时.

现在我知道要解决这个问题,我必须在我的连接字符串中设置multipleactiveresultsets = True.我已经尝试了,它解决了我的问题.

但是,当我运行sql分析器时,从实体框架查询所有客户端,即使我不需要,也自动检索所有的地址.

除了设置multipleactiveresultsets = True之外,还有解决方法吗?我不希望地址被懒惰加载所有的时间.

解决方法

我相信这是因为每个客户的select语句都会导致再次读取数据.为什么不先做ToList(),然后应用映射(选择),如:
var customers= context.CustomerEntities.ToList().Select(Mapper.Map);

我相信这将首先提供数据,然后做映射,你不会有这个问题.

猜你在找的C#相关文章