实体框架:关闭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。
答案 0 :(得分:1)
这就是你所有问题的根源。不要使用shared context并且不要将共享上下文用作data cache或中央数据访问对象 - 它应该被定义为EF中的主要规则之一。这也是你需要MARS的原因(我们之前的问题的讨论现在已经解决了)。当多个客户端同时在共享上下文上执行查询时,它会在同一个数据库连接上打开多个DataReader。
我不确定您为什么会得到当前的例外情况,但我确定您应该重新设计数据访问方法。如果您还修改共享上下文的数据,则必须。
答案 1 :(得分:0)
问题可能来自于尝试从数据库中获取大量数据时的连接超时,因此尝试在代码中设置连接超时,如下所示:
实体5 ((IObjectContextAdapter)this.context)。ObjectContext.CommandT imeout = 1800;
其他实体: this.context.Database.CommandTimeout = 1800;