即使我使用了 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&lt;CompanyCode&gt; 为模型的视图,响应很好并且没有错误。

谁能解释一下这是怎么回事?

【问题讨论】:

没有显示控制器逻辑是如何工作的。通过更改为强类型,您要求 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的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc 重定向加传参

未验证 ASP.NET MVC5 模型

如何在MVC视图中使用DISTINCT?

如何使用 LINQ 和 ASP.NET MVC 持久化用户与其关联的数据库?

使用 C++ 的 MVC 方法

为啥 jquery 会加载第二个,即使它是在 mvc 捆绑配置文件的第一个位置定义的?