即使我使用了 ToList() 方法,MVC 应用程序也会抛出 ObjectDisposedException
Posted
技术标签:
【中文标题】即使我使用了 ToList() 方法,MVC 应用程序也会抛出 ObjectDisposedException【英文标题】:MVC application throws ObjectDisposedException eventhough I used ToList() method 【发布时间】:2016-03-11 14:47:19 【问题描述】:我正在编写 MVC Web 应用程序,但我遇到了一个问题。
尽管我在 dbContext 仍处于打开状态时使用了 ToList() 方法,但应用程序仍会引发 ObjectDisposedException。这是我的代码:
数据访问层:
public List<CompanyCode> SearchCompanyCodes(int? projectId=null)
IQueryable<sl_CompanyCodes> filtered=dbContext.sl_CompanyCodes;
if(projectId!=null)
filtered = filtered.Where(cc => cc.Project_ID == projectId);
return filtered.ToList();
业务逻辑层:
public List<CompanyCode> CompanyCodes(int? cc_projectId=null)
List<CompanyCode> result;
using(var repository=new E6Repository())
result=repository.SearchCompanyCodes(projectId:cc_projectId);
// E6Repository.Dispose calls dbContext.Dispose()
return result;
控制器:
public JsonResult CompanyCodes()
var logic = new GetDataLogic();
List<CompanyCode> l = logic.CompanyCodes();
return Json(l, JsonRequestBehavior.AllowGet);
我不知道该怎么做...当我在控制器中返回操作之前停止调试器时,当我在即时窗口中键入 l 时,我可以看到填充良好的列表(注意此时 dbContext
已经被处理)。
有趣的事情:如果我将 ActionResult 更改为以IEnumerable<CompanyCode>
为模型的视图,响应很好并且没有错误。
谁能解释一下这是怎么回事?
【问题讨论】:
没有显示控制器逻辑是如何工作的。通过更改为强类型,您要求 MVC Binder 提供它所做的强类型。所以它是用活页夹知道的值更新类型的活页夹。这是第一次获取还是第一次发帖? 请显示 CompanyCode 的代码及其映射。这可能是延迟加载问题。 【参考方案1】:我认为您尚未创建 EF 上下文的实例。试试这个:
public List<CompanyCode> SearchCompanyCodes(int? projectId=null)
using (var context = new dbContext())
IQueryable<sl_CompanyCodes> filtered = from compCodes in dbContext.sl_CompanyCodes
select compCodes;
if(projectId!=null)
filtered = filtered.Where(cc => cc.Project_ID == projectId);
return filtered.ToList();
【讨论】:
以上是关于即使我使用了 ToList() 方法,MVC 应用程序也会抛出 ObjectDisposedException的主要内容,如果未能解决你的问题,请参考以下文章