【问题标题】:'The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.'“ObjectContext 实例已被释放,不能再用于需要连接的操作。”
【发布时间】:2018-11-23 09:08:47
【问题描述】:

这个问题已经被问过很多次了。我想我解决了我的问题,但由于我是初学者并且仍在学习,我需要你的保证。

我为登录用户做了一个扩展方法但是当我在我的控制器中使用它时,它给了我标题错误。

System.ObjectDisposedException: 'ObjectContext 实例已被释放,不能再用于需要连接的操作。'

所以我搜索并试验并添加了这行代码 在控制器中解决了我的问题。

db.Users.Attach(LoggedUser);

但是我不确定我的答案是否正确,因为很多关于这个问题的答案都是禁用延迟加载,但我最终没有使用它。

类似的东西。

public class MyDbContext : DbContext
{
  public MyDbContext()
   {
    this.Configuration.LazyLoadingEnabled = false;
   }
}

这是我的扩展方法:

 public static ApplicationUser GetLoggedInUserInDB(this System.Security.Principal.IPrincipal _User)
    {
        using (var db = new ApplicationDbContext())
        {
            string userId = _User.Identity.GetUserId();
            var LoggedUser = db.Users.Find(userId);
            return LoggedUser;
        }
    }

我的控制器:

public class MainPageController : ApiController
{
    [Route("Personal_Project/Main_Page_Personal_Project/UserUnfo")]
    [ResponseType(typeof(string))]
    [Authorize]
    public IHttpActionResult GetUserInfo()
    {
        using (var db = new ApplicationDbContext())
        {
            var LoggedUser = User.GetLoggedInUserInDB();
            //db.Users.Attach(LoggedUser); // This is what I added to solve my problem.
            return Ok(new UserInfoModel
            {
                Name = LoggedUser.UserName,
                Reputation = LoggedUser.Reputation,
                UserLevel = LoggedUser.UserLevel
            });
        }
    }
}

那么这里的“我的”解决方案好吗?只需添加:

db.Users.Attach(LoggedUser);

这是合法的还是我们不是这样解决这个问题的。任何建议将不胜感激

按要求添加:

堆栈跟踪:

ex.StackTrace " 在 System.Data.Entity.Core.Objects.ObjectContext.get_Connection()\r\n
在 System.Data.Entity.Core.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption)\r\n 在 System.Data.Entity.Core.Objects.ObjectQuery1.Execute(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityReference1.Load(MergeOption 合并选项)\r\n 在 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\r\n 在 System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull,对象 wrapperObject)\r\n at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.c__DisplayClass7`2.b__2(TProxy 代理,TItem 项)\r\n 在 System.Data.Entity.DynamicProxies.ApplicationUser_3D8410FBA1701532D53558B4E07B366CC45F4901DA609FCE10D652D704EEDD3C.get_CarGame()\r\n 在 PersonalProject.Controllers.MainPageController.GetUserInfo() 中 C:\Users\Jack\Desktop\PostPersonalProject\PersonalProject\PersonalProject\Controllers\MainPageController.cs:line 32" 字符串

【问题讨论】:

  • 请显示完整的堆栈跟踪。将LoggedUser 附加到另一个上下文看起来毫无意义。
  • 我添加了堆栈跟踪。你说的毫无意义是什么意思?如果我添加它,它会起作用。否则不是。

标签: c# asp.net asp.net-web-api2 asp.net-identity


【解决方案1】:

因此,您会遇到异常:get_CarGame()

原始帖子中的代码与您的实际代码不匹配。

实际 MainPageController.GetUserInfo 的某个地方,您正在尝试阅读ApplicationUser.CarGame。是的,这是延迟加载问题。

GetLoggedInUserInDB 返回代理类的实例,派生自ApplicationUser,并处理原始上下文。当GetUserInfo 尝试获取CarGame 属性值时,代理尝试使用已处置的上下文从数据库中读取它。结果,抛出异常。

如果你真的需要CarGame 里面的UserInfoModel

  • 如上图所示关闭延迟加载,使用急切加载;
  • 使用投影(即Select)将用户信息检索为UserInfoModel。在这种情况下,GetLoggedInUserInDB 方法根本不需要。

无论如何,将 LoggedUser 附加到另一个上下文并不是一个可行的方法。

【讨论】:

  • 非常感谢您的反馈和您的时间。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多