2009-09-04 4 views
1

보기 내에서 ActiveRecord 모델의 지연로드 속성에 액세스하려면 어떻게합니까?ASP.NET MVC 1.0 및 Castle ActiveRecord 2.0 지연로드

나는 게으른로 표시된 둘 카테고리 모델에 속하는 뉴스 모델을 가지고 = 사실 나는 내 컨트롤러

에서 다음을 수행하여 내보기에 게으른로드 속성에 액세스 할 수있어

using (new SessionScope()) 
{ 
    results = _service.FindAllNews(start, pageSize, new[] { Order.Asc("Id") }); 
    foreach (var result in results) 
    { 
     var category = result.Category; 
    } 
} 
return View(results); 

그런 다음 내보기에, 나는 결과를 분석하고 내가 속성 난을 참조하지 않으면 분명히 다음

<%= Html.Encode(item.Category.Title) %> 

과 카테고리 제목을 표시 n 컨트롤러에서보기에서 속성을 호출 할 때 세션 범위 오류가 발생합니다.

그러나 이것은 나에게 잘못되었습니다. 보기에 도달하기 전에 모델의 지연로드 속성을 초기화하는 더 좋은 방법이 있습니까? 모델에 Init 함수를 작성할 수 있다고 가정합니다.하지만 역시 불안정한 것처럼 보입니다.

+1

나는 정규 NHibernate로 같은 일을 만났다. BeginRequest와 EndRequest로 트랜잭션을 이동시켜야했습니다. – mxmissile

+0

귀하의 의견은 대답, mxmissile이어야합니다. 하나의 요청마다 하나의 SessionScope를 가짐으로써 문제를 해결할 수 있지만, 자동 플러시를 사용할 때는주의해야합니다. – wtaniguchi

+0

그래,하지만 그 문제에 대해서는 AR의 SessionScope 또는 AR에 익숙하지 않은데, transaciton 사용법이 일반 NHibernate와 다른지, 다른 말로하면 자격이 있다고 느끼지는 않았다. ;-) – mxmissile

답변

3

나는 AR google 그룹을 찾고 내가 찾고있는 대답을 발견했습니다. 나는 다른 누군가가 똑같은 것을 찾고있는 경우에 대비하여 여기의 모든 사람들과 공유 할 것이라고 생각했습니다.

ActiveRecord를 사용하여 지연로드를 위해 세션 범위를 만들고 파괴하는 위치를 변경하려면 web.config에 다음을 추가해야합니다. 세션 범위 만들고 여기 http://www.castleproject.org/activerecord/documentation/trunk/usersguide/web.html 요청 당 세션 범위와 일치하도록 배치된다

<system.web> 
    <httpModules> 
     <add 
      name="ar.sessionscope" 
      type="Castle.ActiveRecord.Framework.SessionScopeWebModule, Castle.ActiveRecord" /> 
    </httpModules> 
</system.web> 

이 변경.

3

간단한 해결책은 다음과 같습니다.보기에서 지연로드를 수행하지 마십시오. MVC에서 정의에 의한 뷰에는 아무 것도로드 할 비즈니스가 없습니다.

컨트롤러를 사용하면이 동작을 테스트 할 수 있습니다.

네, 매핑에 설정할 필요가 없습니다. 특정 사건에서 열심히로드되도록 다른 Fetchmode로 개체를 쿼리 할 수 ​​있습니다.

+0

표시된 답변은 사용자가 묻는 질문과 직접적인 차이가 있지만 더 좋은 대답입니다. 뷰는 DB에 닿는 어떤 것도해서는 안됩니다. – ConsultUtah