2011-04-29 4 views
1

내가 자기 참조 모델 클래스가 컬렉션에 걸쳐 쿼리 - '느리게 컬렉션을 초기화하지 못했습니다' 내 MVC 3 응용 프로그램에서 JSON 형식으로 단어의 목록을 반환 : 그것은 느리게 컬렉션을 초기화하는 데 실패유창함 자 NHibernate은 -

[HttpPost] 
public JsonResult Synonyms(string wordText) 
{ 
    using (var session = ...) 
    { 
     using (var tx = session.BeginTransaction()) 
     { 
      var word = session.QueryOver<Word>() 
           .Where(w => w.Text == wordText) 
           .SingleOrDefault(); 

      var results = new SynonymsResults() 
      { 
       Words = word.Synonyms 
          .Where(x => x.Extra == 1) 
          .Select(x => x.Text) 
      }; 

      return Json(results); 
     } 

    } 
} 

내가 오류를 받고 있어요. 나는 왜 아직도 여기 같은 세션에 있고 심지어 거래를 사용하고 있기 때문에 왜 그런지 모르겠습니다.

답변

1

결과는 실행이 끝나고 세션이 종료 된 후에 훨씬 나중에 실행됩니다. Json(results)을 반환했다고해서 이러한 결과가 즉시 JSON으로 직렬화되지는 않습니다. 작업이 먼저 실행을 끝내면 ASP.NET MVC 파이프 라인이 결과 (OnResultExecuting)에 대한 실행을 처리하고 JavaScriptSerializer가 이 컬렉션을 터치하게됩니다. 그 시점에서 세션과 트랜잭션은 오래 전에 사라졌습니다.

따라서 ORM에게 부탁하는 컬렉션을 열심히 가져 오거나 following series of blog posts을 더 잘 살펴보고 뷰 모델을 사용하도록 안내하십시오.

+0

감사합니다. Darin! 하나의 후속 질문 : 목록을 열렬하게로드하면 목록의 모든 항목이 열심히로드됩니다. 예를 들어, word.Synonyms.First(). 유사어도로드됩니까? 단어가 데이지 체인 방식으로 연결되어 있으면 데이터베이스가 엄청난 양의 데이터를 가져올 수 있기 때문에 잠재적 인 함정과 같습니다. –

-1

오류를 없애려면 Nuget Pacakage Manager Newton.JSON을 설치하고 해당 프로젝트에 매핑하고 [JsonIgnore]로 속성을 꾸미면 직렬화 문제를 건너 뛰고 오류가 발생하지 않습니다.

관련 문제