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 与此命令关联,必须先关闭

调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'

已经有一个与此命令关联的打开的数据读取器,必须先关闭异常

已经有一个打开的 DataReader 与此命令关联,必须先关闭