实体框架:"读取器关闭时调用Read的无效尝试"没有延迟加载的错误

时间:2014-07-27 23:53:59

标签: entity-framework lazy-loading

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

然后我们在一个循环中调用该SQL Server存储过程,每次循环运行时,5个并发线程传递它们的ID(每个2000个ID)等。这曾经很好地工作但是最近它已经开始崩溃了通过返回此错误指出:读取器关闭时无效尝试调用读取

我已将DbContext的CommandTimeOut属性增加到int.Max,并且我已禁用LazyLoading(我正在调用.ToList以确保获取集合)。在进行这些更改后,事情变得更好,但在导出1,400,000条记录(200万条记录)后,操作仍然失败。

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

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

造成这个问题的原因是什么?

0 个答案:

没有答案