2013-08-09 2 views
0

누구나 왜 다음 코드가 API 컨트롤러 (MVC4)에서 작동하지 않는지 알 수 있습니까? "폐기 된 객체에 액세스 할 수 없습니다"라는 오류 메시지가 나타납니다. 다른 경우에는 ToList()를 호출해야 쿼리가 강제로 실행된다는 것을 알았습니다. 하지만 제 경우에는 SingleOrDefault()를 사용하고 있습니다. 데이터베이스에서 바로 실행되지 않습니까?force singleordefault to

public HttpResponseMessage GetPurchaseOrder(int POId) 
    { 
     PurchaseOrder po; 
     HttpResponseMessage resp; 

     using (PMDataDataContext database = new PMDataDataContext()) 
     { 
      po = database.PurchaseOrders.SingleOrDefault(x => x.POId == POId); 
      if (po == null) 
      { 
       var message = string.Format("id = {0} not found", POId); 
       HttpError err = new HttpError(message); 
       resp = Request.CreateResponse(HttpStatusCode.NotFound, err);      
      } 
      else 
      { 
       resp = Request.CreateResponse(HttpStatusCode.OK, po); 
      } 
     } 
     return resp; 
    } 

답변

0

는 네,하지만 필요하지만됩니다 사용할 수 없습니다.

+0

나는 내 문제를 해결하기 위해이 대답을 포기하고 싶었다. 그러나 나는 명성 점수가 충분하지 않기 때문에 나를 허락하지 않았다. – Ray

+0

오, 방금 알아 냈습니다. 나는 내가 체크 표시를 클릭 할 수 있다는 것을 몰랐다. – Ray

0

데이터베이스에 대한 컨텍스트가 쿼리 직후에 처리되도록하십시오. SingleOrDefault은 데이터베이스에 쿼리를 즉시 보내야합니다. 당신이 컨텍스트 PurchaseOrder, 웹 API 개체를 직렬화 할 때, EF는 데이터베이스에서 데이터를 가져 오기 위해 노력할 것입니다 및이에 대한 모든 게으른로드 속성이있는 경우

public HttpResponseMessage GetPurchaseOrder(int POId) 
{ 
    PurchaseOrder po; 
    HttpResponseMessage resp; 

    using (PMDataDataContext database = new PMDataDataContext()) 
    { 
     po = database.PurchaseOrders.SingleOrDefault(x => x.POId == POId); 
    } 

    if (po == null) 
    { 
     var message = string.Format("id = {0} not found", POId); 
     HttpError err = new HttpError(message); 
     resp = Request.CreateResponse(HttpStatusCode.NotFound, err);      
    } 
    else 
    { 
     resp = Request.CreateResponse(HttpStatusCode.OK, po); 
    } 

    return resp; 
} 
+0

나는 이것을 시도했지만 여전히 같은 오류가 발생했습니다. – Ray

0

Badri이 내 문제를 해결하도록 안내했습니다. 내 코드에 중단 점을 배치하고 디버그 모드를 따랐을 때 관련 객체 중 하나가 가져올 컨텍스트가 필요했습니다. PurchaseOrder.Item.ItemCategory 속성은 관련 속성을보고있을 때 ObjectDisposedException을 제공하고있었습니다.

나는 SingleOrDefault 호출을 사용하여 po를 가져 오기 전에 database.DeferredLoadingEnabled = false를 배치하여 해결했습니다.