Entity framework 实体框架:“当读卡器关闭时调用读取的尝试无效”错误,没有延迟加载

Entity framework 实体框架:“当读卡器关闭时调用读取的尝试无效”错误,没有延迟加载,entity-framework,lazy-loading,Entity Framework,Lazy Loading,我们使用一个存储过程从数据库导出一些数据。我们传递ID列表,它返回相应的记录。通常有200万个ID要传递给SP,为了减少负载,我们将这些ID分解为多个批次。每批有2000个ID 然后,我们在循环中调用SQL Server存储过程,每次循环运行时,5个并发线程都会传递各自的IDs 2000 ID,等等。这过去工作得很好,但最近由于返回以下错误而开始出现故障:当读卡器关闭时调用Read的尝试无效 我已经将DbContext的CommandTimeOut属性增加到int.Max,并且我已经禁用了Laz

我们使用一个存储过程从数据库导出一些数据。我们传递ID列表,它返回相应的记录。通常有200万个ID要传递给SP,为了减少负载,我们将这些ID分解为多个批次。每批有2000个ID

然后,我们在循环中调用SQL Server存储过程,每次循环运行时,5个并发线程都会传递各自的IDs 2000 ID,等等。这过去工作得很好,但最近由于返回以下错误而开始出现故障:当读卡器关闭时调用Read的尝试无效

我已经将DbContext的CommandTimeOut属性增加到int.Max,并且我已经禁用了LazyLoading加上我正在调用的.ToList,以确保集合被提取。在做了这些更改之后,情况有所好转,但在导出了200万条记录中的140万条后,操作仍然失败

以下是由并发线程运行的代码:

public List<ExportedData> GetDownloads(IEnumerable<int> downloadIds)
    {
        var results = new List<ExportedData>();

        using (var dbc = new DefaultEntities())
        {
            dbc.CommandTimeout = CommandTimeOut;
            dbc.ContextOptions.LazyLoadingEnabled = false;
            results.AddRange(dbc.ExportDownloads(string.Join(";", downloadIds), true).ToList());
            dbc.Connection.Close();
        }

        return results;
    }

此问题的原因是什么?

传入的ID有多大?传入SP的参数的数据类型是什么?您所说的多大是什么意思,@DavidG?ID是整数,每次我们传递2000个ID的列表时。如上面代码所示,参数为a;单独的ID列表。第二个参数并没有真正使用,我只是想了解传递给过程sp1的字符串有多大;2.3不同于12345678;12345679;12345680@DavidG我现在明白了:-每个ID几乎都是一个5位整数值。