小编典典

实体框架:已经有一个打开的 DataReader 与此命令关联

all

我正在使用实体框架,有时我会收到此错误。

EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...

即使我没有进行任何手动连接管理。

此错误间歇性发生。

触发错误的代码(为便于阅读而缩短):

        if (critera.FromDate > x) {
            t= _tEntitites.T.Where(predicate).ToList();
        }
        else {
            t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
        }

使用 Dispose 模式以每次打开新连接。

using (_tEntitites = new TEntities(GetEntityConnection())) {

    if (critera.FromDate > x) {
        t= _tEntitites.T.Where(predicate).ToList();
    }
    else {
        t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
    }

}

仍有问题

如果连接已经打开,为什么 EF 不重用它。


阅读 82

收藏
2022-04-19

共1个答案

小编典典

这不是关闭连接。EF 正确管理连接。我对这个问题的理解是,在单个连接(或具有多个选择的单个命令)上执行了多个数据检索命令,而下一个 DataReader
在第一个完成读取之前执行。避免该异常的唯一方法是允许多个嵌套的 DataReaders = 打开
MultipleActiveResultSets。总是发生这种情况的另一种情况是,当您迭代查询结果 (IQueryable)
时,您将触发迭代内已加载实体的延迟加载。

2022-04-19