.NET ToLookup()(System.Linq)和数据库连接

时间:2011-12-09 11:17:27

标签: .net asp.net-mvc-3 entity-framework-4.1 ninject datareader

我正在构建一个.NET 4.0 MVC3应用程序。我使用Entity Framework 4.1和Ninject将我的存储库注入控制器:

Bind(Of IDataContext).To(Of DataContext)().InRequestScope()

我有一个带有动作的控制器,它利用MyObject(POCO实体)静态函数并将存储库对象传递给它。该函数应该检查db对象是否填充了正确的数据(并返回布尔值):

Dim isComplete as Boolean = MyObject.IsComplete(_context, id, qid)

IsComplete(现在是虚拟)函数如下所示:

Public Shared Function IsComplete(context As IDataContext, id As Integer, qid As Integer) As Boolean
    Dim lookUp As Lookup(Of Integer, Integer) =
    context.QuestionBlockAnswers.Where(Function(m) (m.BlockId = id AndAlso m.QuestionAnswer.QuestionField.Question.QuestionGroup.QuestionnaireVersion.QuestionnaireId = qid)).ToLookup(Function(m) m.QuestionAnswer.QuestionField.Question.Id, Function(m) m.QuestionAnswerId)
    Return True
End Function

正如您所看到的,它只初始化一个lookUp变量并返回true。问题是这个lookUp给了我困难时期。如果我调用该操作(在这种情况下我使用ajax调用),则会收到错误:

[InvalidOperationException]: There is already an open DataReader associated with this Command which must be closed first.

如果我评论lookUp变量的初始化,我不再得到错误。将上下文作为参数传递给静态函数也不是问题,因为我为其他一些对象执行它并且它工作正常。仅在使用ToLookup的情况下才会失败。

你有什么想法我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您需要在连接字符串中添加MultipleActiveResultSets=true;

这是EF正常工作的要求。