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