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

ara*_*333 27 c# asp.net json

我使用EF 4来检索员工列表.

public ContentResult AutoCompleteResult(string searchText)
{
    List<Employee> list = Employee.GetAllCurrentEmployees();
    List<Employee> filteredEmployees = list
        .Where(x => x.GetName().ToLower().Contains(searchText.ToLower()))
        .ToList();

    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    var jsonString = jsonSerializer.Serialize(filteredEmployees).ToString();
    return Content(jsonString);
}
Run Code Online (Sandbox Code Playgroud)

列表检索正常,但是当我序列化它时,我得到了这个异常;

System.ObjectDisposedException: The ObjectContext instance has been
 disposed and can no longer be used for
 operations that require a connection.
     Generated: Wed, 17 Nov 2010 16:06:56 GMT

 System.ObjectDisposedException: The ObjectContext instance has been
 disposed and can no longer be used for operations that require a connection. 
 at
 System.Data.Objects.ObjectContext.EnsureConnection()
 at
 System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)     at
 System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)     at
 System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)  at
 System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)     at
 System.Data.Objects.DataClasses.RelatedEnd.Load() at
 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() at
 System.Data.Objects.DataClasses.EntityCollection`1.System.Collections.IEnumerable.GetEnumerator() at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
 o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse,
 SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
 o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
 obj, StringBuilder output, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
 obj, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj)     at
 SHP.Controllers.EmployeeController.AutoCompleteResult(String searchText) in C:\Documents and Settings\geoffreypayne\My Documents\Visual Studio
 2010\Projects\MVC\SHP\SHP\Controllers\EmployeeController.cs:line
 623     at lambda_method(Closure , ControllerBase , Object[] )     at
 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)    at
 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
 controllerContext, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
 controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.InvokeActionMethodWithFilters>b__a()
 at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
 filter, ActionExecutingContext preContext, Func`1 continuation)    
 at
 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
 controllerContext, String actionName)
Run Code Online (Sandbox Code Playgroud)

我觉得这很奇怪.我已经检索了员工列表,并且已经处理了DataContext.那么为什么我会收到这个错误?

Mar*_*ell 24

听起来你有一些懒惰加载的关系属性尚未加载(具有关联的"n + 1"性能问题).您可以尝试急切加载,看看这是否有帮助; 否则,关闭对象上下文之前,显式加载列表中每个项目的数据.

  • @ arame3333 - 因为你在讨论`JavaScriptSerializer`,一个匿名类型会做得很好 - 只需`选择新的{row.Foo,row.Bar}`等 (2认同)

Cle*_*ud8 19

您可以关闭延迟加载来解决此问题.
在"使用"块中,试试这个:

yourObjectContext.ContextOptions.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

执行此操作后,我能够将我的EF(DbContext生成的)POCO序列化为JSON而没有任何问题.

*注意:因为我已经关闭了延迟加载...在将对象序列化为JSON之前,我明确地提取了我需要的相关对象(在我的查询中大部分使用.Include()).

  • 我认为代码必须是:`yourObjectContext.Configuration.LazyLoadingEnabled = false;`以EF6方式. (7认同)

Mar*_*rio 12

以为我会以2美分的价格来到这里.我们有一个非常大的数据访问层,其中一个程序员习惯使用上下文的using语句,如下所示:

using (EntityModel myContext = EntityConnection)
{
    //code in here to grab data
}
Run Code Online (Sandbox Code Playgroud)

我们使用EntityConnection作为静态属性,为每个当前的HttpContext提供dbContext.在他的using块之后调用的任何方法都会抛出异常'ObjectContext实例已被处理',因为显然上下文在他的方法调用之后被处理掉了.因此,如果您只为每个HttpContext使用一个实体上下文,请确保您不允许垃圾收集器使用using块来处置它.

我想我会把它放在答案中,因为我知道很多人使用不同的实体上下文,我看到很多代码样本中都使用了块.

  • 马里奥+1这是我遇到的问题.我使用EF来根据搜索框中输入的字母获取自动建议.我试图使用using {}块但是收到此错误.现在我只使用一个实例但不确定正确的处理方式.你能提供什么建议吗? (3认同)