c# - entityframework 已经有一个与此命令关联的打开的 DataReader,必须先将其关闭

标签 c# .net entity-framework linq-to-sql

我有以下代码从客户表中检索数据

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 函数时,已经有一个打开的 DataReader 与此命令关联,必须先将其关闭

现在我知道要解决这个问题,我必须在我的连接字符串中设置 multipleactiveresultsets=True。我试过了,确实解决了我的问题。

但是,当我运行 SQL 分析器时,从 Entity Framework 查询所有客户也会自动检索所有地址,即使我不需要它们。

除了必须设置 multipleactiveresultsets=True 之外,还有解决方法吗?我不希望地址一直延迟加载。

最佳答案

我相信这是因为对于每个 Customer,select 语句都会导致再次读取数据库。为什么不先执行 ToList() 然后应用映射(Select),例如:

var customers= context.CustomerEntities.ToList().Select(Mapper.Map);

我相信这会先带来数据,然后再进行映射,您不会遇到这个问题。

关于c# - entityframework 已经有一个与此命令关联的打开的 DataReader,必须先将其关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065684/

相关文章:

c# switch 语句比 vb.net 'case' 更受限制

c# - 实体 SQL 和 SQL 注入(inject)

c# - 根据用户输入创建数据库和实体模型

c# - Entity Framework 的双重自引用属性

c# - 了解多线程 C#

c# - 读取和保存到数据库的提示

c# - 在 .NET 中运行具有重定向文件路径的进程

c# - 捕捉零行已更新

c# - 如何在 C#.NET 中从本地 IP 解析主机名?

紧凑框架上的 C# Double.TryParse 等效项