操作无法完成,因为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;
}
}
}
}
问题在于您的GetUsers
方法。users = userContext.Users;
代码行为您提供了一个查询操作,当您尝试与users.Any() == false
行一起使用该查询时,您将获得指定的错误,因为您试图在处置后使用UserContext
(UserContext
在using
块的末尾处置)。即使在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;
}
}
}