【问题标题】:The operation cannot be completed because the DbContext has been disposed - MVC Asp.net Error: [duplicate]操作无法完成,因为 DbContext 已被释放 - MVC Asp.net 错误:[重复]
【发布时间】:2016-10-03 13:31:48
【问题描述】:

我是 MVC 和 Entity 的新手,我正在尝试从我的一个表中访问数据。我正在使用以下代码访问数据库,但出现以下错误:操作无法完成,因为 DbContext已被处置。 这是我的堆栈跟踪和代码:

 at System.Data.Entity.Core.Objects.ObjectContext.get_Connection()
 at System.Data.Entity.Core.Objects.Internal.ObjectQueryState.get_DefaultStreamingBehavior()
 at System.Data.Entity.Core.Objects.Internal.ObjectQueryState.get_EffectiveStreamingBehavior()
 at System.Data.Entity.Core.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
 at System.Data.Entity.Core.Objects.ObjectQuery.ToTraceString()
 at System.Data.Entity.Internal.Linq.InternalSet`1.ToString()
 at System.Data.Entity.Infrastructure.DbQuery`1.ToString()
 at System.IO.TextWriter.Write(Object value)
 at System.IO.TextWriter.SyncTextWriter.Write(Object value)
 at System.Console.Write(Object value)
 at VideoTrainingSystem.Controllers.AdminController.Index() in C:\Users\lg701\Documents\Visual Studio 2015\Projects\VTS2\VTS\Controllers\AdminController.cs:line 18

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using System.Web.Mvc;
 using VTS.Models;

 namespace VTS.Controllers
 {
     public class AdminController : Controller
     {
        // GET: Admin
        public ActionResult Index()
        {
           try
           {
              var test = GetUsers();
           }
           catch (Exception ex)
           {
               Console.Write(ex);
           }

        return View();
    }


    public IQueryable<User> GetUsers()
    {
        IQueryable<User> users;
        using (UserContext userContext = new UserContext())
        {
            users = userContext.Users;
        }

        if (users.Any() == false)
        {
            return null;
        }
        else
        {
            return users;

        }
    }
}

}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-mvc-4


    【解决方案1】:

    问题出在您的GetUsers 方法中。 users = userContext.Users; 代码行为您提供了一个要操作的查询,当您尝试将该查询与 users.Any() == false 行一起使用时,您将收到指定的错误,因为您在处理 UserContext 后尝试使用它(UserContext 已处理在using 块的末尾)。即使您在 using 块内使用此行,返回的 IQuerable 也将无用。尝试使用工作单元和存储库模式。您可以关注this tutorial 以了解有关该模式的更多信息。最初对于一个简单的错误,它可能看起来很长的解决方案(或overkill),但是一旦你习惯了这个,它使用起来非常方便和灵活,你会节省很多时间在从长远来看。

    【讨论】:

      【解决方案2】:

      您需要使用“using”块包装您的 return 语句,否则数据库上下文将过期,并且“users”对象依赖于该上下文,因为它包含从数据库中选择的数据:

      public IQueryable<User> GetUsers()
      {
          IQueryable<User> users;
          using (UserContext userContext = new UserContext())
          {
              users = userContext.Users;
      
              if (users.Any() == false)
              {
                  return null;
              }
              else
              {
                  return users;
              }
          }
      }
      

      【讨论】:

      • 谢谢你,我根据你的建议修改了我的代码,但我得到了同样的错误。
      • 不,这行不通。您的最小解决方案必须包含 ToList(),请参阅副本。
      【解决方案3】:

      什么时候使用using语句,框架会处理分配给资源的所有资源。 您需要将 if/else 块移动到 using 块;

       public IQueryable<User> GetUsers() 
       {
          IQueryable<User> users;
          using (UserContext userContext = new UserContext())
          {
              users = userContext.Users;
      
              if (users.Any() == false)
              {
                  return null;
              }
              else
              {
                  return users;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        • 2015-04-03
        • 2015-08-09
        相关资源
        最近更新 更多