C# · 12月 30, 2021

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

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