从数据库获取列表时发生ObjectDisposedException

时间:2019-07-15 15:56:36

标签: asp.net-mvc entity-framework exception

使用ASP.NET MVC 5和Entity Framework 6,我试图从数据库中获取用户具有的所有通知值的列表。这段代码确实可以正常工作,现在尝试将列表发送回javascript时,我得到了ObjectDisposedException

控制器方法:

public JsonResult NotifPrefsOpen()
{
        try
        {
            List<NotificationPreference> notifPreference;

            using (MEDContext MContext = new MEDContext())
            using (StaffContext SContext = new StaffContext())
            {
                AuthorizationUtil au = new AuthorizationUtil(HttpContext, MContext, SContext);
                PreferenceService ps = new PreferenceService(MContext);
                notifPreference = ps.NotificationAllGet(au.EmployeeNumber);

                return Json(new { Success = true , notifPreference});
            }
        }
        catch (Exception ex)
        {
            Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            string msg = LogError(GetType().FullName, ex);
            return Json(new { Success = false, ErrorMessage = msg });
        }
}

服务方法

public List<NotificationPreference> NotificationAllGet (int employeeNumber)
{
    IQueryable<NotificationPreference> result = 
           (from n in _context.NotificationPreference
            where n.employeeNumber == employeeNumber
            select n);
    return result.ToList();
}

这里是例外:

  

System.Reflection.TargetInvocationException:调用的目标引发了异常。

     

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

     

在System.Data.Entity.Core.Objects.ObjectContext.get_Connection()
  在System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption)上
  在System.Data.Entity.Core.Objects.ObjectQuery 1.Execute(MergeOption mergeOption)
at System.Data.Entity.Core.Objects.DataClasses.EntityReference
1.Load(MergeOption mergeOption)处
  在System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()处
  在System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty [TItem](TItem属性值,字符串关系名称,字符串targetRoleName,布尔值mustBeNull,对象wrapperObject)
  在System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior。<> c__DisplayClass7`2.b__2(TProxy代理,TItem项)
  在System.Data.Entity.DynamicProxies.NotificationPreferen_93CF7ED7D23D42FE98298039206E4A93E5B136BB3DCBF9EFA5D02A3E8330CADF.get_AppUser()

1 个答案:

答案 0 :(得分:0)

  

System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior。

在处置DbContext之后,JSON序列化正在触发Lazy Loading。因此,请禁用它,并在构造JsonResult之前确保要加载要序列化的所有相关实体。