加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – entityframework已经有一个与此Command关联的打开的DataRe

发布时间:2020-12-15 06:53:58 所属栏目:百科 来源:网络整理
导读:我有以下代码从客户表中检索数据 var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList(); mapper函数将实体对象映射到业务对象,它看起来像这样 internal static Customer Map(CustomerEntity entity) { if (entity ==
我有以下代码从客户表中检索数据
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);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读