C# MultipleActiveResultSets vs Multiple';使用();声明
在我的控制器中,我尝试使用C# MultipleActiveResultSets vs Multiple';使用();声明,c#,dbcontext,datareader,C#,Dbcontext,Datareader,在我的控制器中,我尝试使用foreach循环外部定义的上下文从foreach循环内的datatable检索数据,但收到错误,指出DataReader已在使用。在这里搜索Stackoverflow之后,我发现了一篇关于添加MultipleActiveResultSets=true到my Web.config。成功了 我还阅读了关于在新上下文中包装调用的内容,实现了using()函数来在调用后处理上下文,因此每次通过foreach循环都会创建并处理上下文 这是带有using语句的代码 using (
foreach
循环外部定义的上下文从foreach
循环内的datatable检索数据,但收到错误,指出DataReader已在使用。在这里搜索Stackoverflow之后,我发现了一篇关于添加MultipleActiveResultSets=true代码>到my 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);
}
foreach(clientcases中的var currentcase)
{
var计费=新列表();
var casetoadd=新的CaseViewModel();
var casebilling=_Context.Billings.Where(b=>b.CaseId==currentcase.Id.ToList();
案例添加账单=案例账单;
casetoadd.Id=当前case.Id;
casetoadd.CaseNumber=当前Case.CaseNumber;
clientCases.Add(casetoadd);
}
这就是导致错误的原因MultipleActiveResultSets允许应用程序在每个连接上有多个挂起的请求。在您的情况下,这并不是错误的原因,实际使用它而不在using语句中包装上下文会导致SQL继续为同一请求打开连接(错误做法)。您的问题是(我假设您没有发布您的原始代码),您使用的是延迟加载的LINQ(默认设置),并且在通话中您没有调用“.ToList”方法,该方法执行SQL调用,该调用将为您提供一个内存中的数据列表,您无需返回数据库即可自由循环。
旁注使用语句只是处理上下文的最佳实践,但它不是必需的,当应用程序执行垃圾收集时,上下文将调用dispose