5

WCF 데이터 서비스를 개발 중입니다. 클라이언트 측에서 액세스하려고하면이 예외가 발생합니다.ObjectContext 인스턴스가 삭제되어 더 이상 연결이 필요한 작업에 사용할 수 없습니다.

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; 
} 
+1

반환하기 전에 IQueryable을 평가해야합니다. 그렇지 않으면 IEnumerable 또는 유사하게 설정해야합니다. 기본적으로는 게으른 콜렉션을 반환합니다. 누구든지 데이터베이스를 통해 데이터를 가져올 기회가 있기 전에 데이터베이스 연결을 꺼내야합니다. –

답변

15

나는 문제가 당신이 표시되지 않는 것 ...을 표시 코드에서 의심.

반환하기 전에 쿼리를 완전히 평가했는지 확인하십시오. 예를 들어, 대신에 단지 일 경우 :

return studentQry; 

일을보십시오 :

return studentQry.ToList(); 

편집 : 당신은 당신이 IQueryable<T>를 반환하고 있음을 반영하기 위해 질문을 변경했습니다 이제

IEnumerable<T> 대신에 별도의 문제가 있습니다. 귀하의 방법에서 IQueryable<T>을 반환함으로써 유형을 서버 측에서 직접 "쿼리"할 수 있다고 제안하게됩니다.

그러나 WCF는이를 통해 일련 번호를 serialize하고 구체적인 구현 유형을 사용해야합니다. IEnumerable<T>은 허용되지만, IQueryable<T>은 허용되지 않습니다. 결과를 올바르게 전달할 수 있도록 완전히 평가할 유형으로 전환해야합니다.

+2

제안 해 주셔서 감사합니다. 반환 형식을 IEnumerable로 변경 한 다음 studentQry.AsEnumerable() 또는 studentQry 대신 studentQry.ToList()를 반환해야했습니다. – Attilah

+0

고마워. 너는 나에게 두통을 많이 덜어 줬어. – Attilah

+0

@Attilah : 도와 줘서 고맙습니다.) 기쁘게 생각합니다. –

2

아마도 클라이언트가 하위 속성에 액세스하려고 시도하고 있습니다 (예 : student.classes가 다른 엔터티이고 클라이언트에서 액세스하려고하는 경우). 모든 하위 엔티티에 포함을 지정해야합니다.

2

귀하의 사용으로 인해 발생합니다. linq 쿼리가 평가되기 전에 DataContext가 삭제됩니다. studentQry.ToList()를 반환하고 이것이 작동하는지 확인할 수 있습니다. 그렇지 않으면 시도하십시오

List<Student> retValue; 
retValue = studentQry.ToList(); 
return retValue; 

마지막으로, 못 생겼지 만 사용하지 않으면이 문제가 발생하지 않습니다. 궁극적으로는 가비지 수집에 의해 처리되고 정리되어야합니다.

6

이것은 Using 문 때문입니다. 함수가 실행을 끝내면 객체 컨텍스트가 삭제됩니다. 결과 IQueryable이 열거되면 폐기 된 객체를 사용하려고 시도하므로 예외가 발생합니다. 사용을 제거하고 귀하의 서비스가 IDisposable을 구현하고 IDisposable.Dispose()에 객체 컨텍스트를 처리하게하십시오.

+0

이것은 내 문제였습니다. using 문은 서비스가 완료되기 전에 객체 컨텍스트를 삭제합니다. using 문을 제거했는데 이것이 효과가있었습니다. – Flea