实体框架:关闭DataReader时调用'Read'

时间:2011-02-02 15:40:56

标签: entity-framework .net-4.0

实体框架:关闭DataReader时调用'Read'

当我使用并行异步调用来解决我的服务时,我间歇性地遇到这个问题。

我知道在我定义的EF查询上调用.ToList()时会访问阅读器。

我想了解构建EF查询以避免这种情况和similar问题的最佳做法。

我的架构如下:

我的实体数据层是一个静态类,带有静态构造函数,用于实例化我的实体(_myEntities)。它还在我的实体上设置属性,例如MergeOption。

这个静态类公开了只访问实体的公共静态方法。

public static GetSomeEntity(Criteria c) {
    ...
    var q = _myEntitites.SomeEntity.Where(predicate);
    return q.ToList();
}

这已经在生产中工作了一段时间,但是上面的错误和一个here间歇性地发生,特别是在客户的重负荷下。

我目前还在连接字符串中设置 MultipleActiveResultSets = True。

2 个答案:

答案 0 :(得分:1)

这就是你所有问题的根源。不要使用shared context并且不要将共享上下文用作data cache或中央数据访问对象 - 它应该被定义为EF中的主要规则之一。这也是你需要MARS的原因(我们之前的问题的讨论现在已经解决了)。当多个客户端同时在共享上下文上执行查询时,它会在同一个数据库连接上打开多个DataReader。

我不确定您为什么会得到当前的例外情况,但我确定您应该重新设计数据访问方法。如果您还修改共享上下文的数据,则必须

答案 1 :(得分:0)

问题可能来自于尝试从数据库中获取大量数据时的连接超时,因此尝试在代码中设置连接超时,如下所示:

实体5 ((IObjectContextAdapter)this.context)。ObjectContext.CommandT imeout = 1800;

其他实体: this.context.Database.CommandTimeout = 1800;