MultipleActiveResultSets与Multiple' using()'声明

时间:2016-07-10 18:40:43

标签: c# dbcontext datareader

在我的控制器中,我尝试使用foreach循环外部定义的上下文从foreach循环内的数据表中检索数据,但收到错误,指出DataReader已在使用中。在Stackoverflow上搜索之后,我发现了一篇关于将MultipleActiveResultSets=true;添加到我的Web.config的帖子。那很有效。

我还读到了在一个新的上下文中包含调用,该上下文实现了using()函数以在调用之后处理上下文,因此每次遍历foreach循环都会创建然后处理上下文。

这是包含using语句的代码

using (var _billingContext = new ContextModel())
{
    var casebilling = _billingContext.Billings.Where(b => b.CaseId == currentcase.Id).ToList();
    casetoadd.Billings = casebilling;
}

这样或那样有优势吗?

编辑以显示原始代码:

foreach (var currentcase in clientcases)
{
    var billing = new List<Billing>();
    var casetoadd = new CaseViewModel();

    var casebilling = _Context.Billings.Where(b => b.CaseId == currentcase.Id).ToList();
    casetoadd.Billings = casebilling;
    casetoadd.Id = currentcase.Id;
    casetoadd.CaseNumber = currentcase.CaseNumber;
    clientCases.Add(casetoadd);
}

这就是给我错误

的原因

1 个答案:

答案 0 :(得分:1)

MultipleActiveResultSets允许应用程序为每个连接提供多个待处理请求。在你的情况不是你的错误的原因,实际上使用它而不包含使用语句中的上下文将导致SQL继续为同一请求打开连接(不良做法)。你的问题是(我假设因为你没有发布你的原始代码)你正在使用延迟加载的LINQ(默认)并且在你的通话中你还没有调用“ .ToList ”方法执行SQL调用,它会为您提供数据的内存列表,您可以自由循环,而无需返回数据库。 旁注使用语句只是处理上下文的最佳实践,但不是必需的上下文将在您的应用程序进行垃圾收集时调用dispose。