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

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>.您应该将其切换为将完全评估的类型,以便可以正确传递结果.

  • 谢谢你的建议.我必须将返回类型更改为IEnumerable,然后返回studentQry.ToList()而不是studentQry.AsEnumerable()或studentQry. (2认同)

arc*_*hil 6

这是因为Using语句.当您的函数完成执行时,它会处理对象上下文.枚举结果IQueryable时,它会尝试使用disposed,因此您将获得Exception.删除使用,让你的服务实现IDisposable并在IDisposable.Dispose()中处理你的对象上下文