entityframework 已经有一个与此命令关联的打开的 DataReader 必须先关闭
Posted
技术标签:
【中文标题】entityframework 已经有一个与此命令关联的打开的 DataReader 必须先关闭【英文标题】:entityframework There is already an open DataReader associated with this Command which must be closed first 【发布时间】:2013-04-10 13:09:56 【问题描述】:我有以下代码从客户表中检索数据
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 函数时收到错误消息:There is already an open DataReader associated with this Command which must be closed first
。
现在我知道要解决这个问题,我必须在我的连接字符串中设置multipleactiveresultsets=True
。我试过了,它确实解决了我的问题。
但是,当我运行 SQL 分析器时,从实体框架查询所有客户也会自动检索所有地址,即使我不需要它们。
除了必须设置multipleactiveresultsets=True
之外,还有其他解决方法吗?我不希望地址一直被延迟加载。
【问题讨论】:
您可能想在此处的示例之前检查您的代码,我敢打赌,在您的代码被触发之前,您还有另一个上下文处于活动状态。 不,我没有其他活动上下文 丹,你可能正在做点什么。让我试试 【参考方案1】:我相信这是因为对于每个Customer
,select 语句都会导致再次读取数据库。你为什么不先做 ToList()
然后应用映射 (Select
) 之类的:
var customers= context.CustomerEntities.ToList().Select(Mapper.Map);
我相信这会先带来数据,然后进行映射,您就不会遇到这个问题。
【讨论】:
这样做会将整个集合具体化到内存中,如果您正在处理大量数据,那么如果您可以避免它,那么您应该避免它,这是一个非常糟糕的主意。 除非你有一些积极的贡献,即替代方案......以上是关于entityframework 已经有一个与此命令关联的打开的 DataReader 必须先关闭的主要内容,如果未能解决你的问题,请参考以下文章
已经有一个打开的 DataReader 与此命令关联,必须先关闭
已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]
已经有一个打开的 DataReader 与此命令关联,必须先关闭