操作无法完成,因为DbContext已被处理- MVC Asp.net错误:

本文关键字:MVC 处理 Asp net 错误 DbContext 因为 操作 | 更新日期: 2023-09-27 18:11:29

我是MVC和实体的新手,我正试图从我的一个表访问数据。我正在使用以下代码访问数据库,但是我得到了以下错误:操作无法完成,因为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;
        }
    }
}

}

操作无法完成,因为DbContext已被处理- MVC Asp.net错误:

问题在于您的GetUsers方法。users = userContext.Users;代码行为您提供了一个查询操作,当您尝试与users.Any() == false行一起使用该查询时,您将获得指定的错误,因为您试图在处置后使用UserContext (UserContextusing块的末尾处置)。即使在using块中使用这一行,返回的IQuerable也将是无用的。尝试使用工作单元和存储库模式。您可以按照本教程了解有关这些模式的更多信息。最初,对于一个简单的错误,这似乎是一个冗长的解决方案(或者过度使用),但是一旦您习惯了这一点,它就非常方便和灵活地使用,并且从长远来看,这样做将节省大量时间。

您需要用"using"块包装您的返回语句,否则数据库上下文将过期,并且"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;
        }
    }
}

当你使用using语句时,框架会释放所有为资源分配的资源。你需要使用 block;

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