我使用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.那么为什么我会收到这个错误?
Cle*_*ud8 19
您可以关闭延迟加载来解决此问题.
在"使用"块中,试试这个:
yourObjectContext.ContextOptions.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我能够将我的EF(DbContext生成的)POCO序列化为JSON而没有任何问题.
*注意:因为我已经关闭了延迟加载...在将对象序列化为JSON之前,我明确地提取了我需要的相关对象(在我的查询中大部分使用.Include()).
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块来处置它.
我想我会把它放在答案中,因为我知道很多人使用不同的实体上下文,我看到很多代码样本中都使用了块.