Att*_*lah 5 c# wcf entity-framework exception-handling wcf-data-services
我正在开发一个WCF数据服务.当我尝试从客户端访问它时,我得到以下异常:
ObjectContext实例已被释放,不能再用于需要连接的操作.
码:
[WebGet]
public IQueryable<Student> GetUsersByClassId(string classId)
{
Check.Argument.IsNotEmptyOrNull(classId, "classId");
using (var db = new schoolContext(connectionString))
{
((IObjectContextAdapter)db).ObjectContext.ContextOptions.ProxyCreationEnabled = false;
((IObjectContextAdapter)db).ObjectContext.ContextOptions.LazyLoadingEnabled = false;
var studentQry = from s in db.Student.Include("Class")
where s.Class.Id == classId
select s;
if(studentQry == null)
return new List<Student>().AsQueryable();
else
return studentQry;
}
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 15
我怀疑问题是在标记的代码中...
,您没有显示.
确保在返回之前完全评估您的查询.例如,而不是只做:
return studentQry;
Run Code Online (Sandbox Code Playgroud)
尝试做:
return studentQry.ToList();
Run Code Online (Sandbox Code Playgroud)
编辑:
既然你已经改变了你的问题以反映你的回归IQueryable<T>
而不是IEnumerable<T>
,那么就有一个单独的问题.通过IQueryable<T>
从您的方法返回,您建议可以直接在服务器端"查询"该类型.
但是,WCF正在通过网络对其进行序列化,并且需要使用具体的实现类型. IEnumerable<T>
是允许的,但不是IQueryable<T>
.您应该将其切换为将完全评估的类型,以便可以正确传递结果.
这是因为Using语句.当您的函数完成执行时,它会处理对象上下文.枚举结果IQueryable时,它会尝试使用disposed,因此您将获得Exception.删除使用,让你的服务实现IDisposable并在IDisposable.Dispose()中处理你的对象上下文