2012-04-27 4 views
2

json 개체를 반환하는 여러 가지 동작 메서드가 있습니다. 예 :ASP.NET MVC : 컨트롤러 동작을 끝내기 전에 json serialization 강제 수행

public JsonResult MyAction() 
{ 
    var entities = db.Entities.Include("Location").Where(e => e.Name != null); 
    var model = entities.Select(e => new MyModel(e)); 
    return Json(model, JsonRequestBehavior.AllowGet); 
} 

일부 모델 클래스에서 나는 엔터티의 내부 요소에 액세스합니다.

public class MyModel 
{ 
    private Entity _e; 
    public MyModel(Entity e) 
    { 
    _e = e; 
    } 

    public string[] LocationName 
    { 
    get 
    { 
     return _e.Location.Name; 
    } 
    } 
} 

이 잘 작동 경우 Global.asax.cs 파일의 OnRequestCompleted 같은 장소에서 I 저장소 (dB). 문제는 바로 지금 BaseController의 OnActionExecuted 메서드에 db를 삭제하고 개체를 직렬화하면 bc가 실패하고 연결이 이미 닫혀 있다는 것입니다.

내 질문은 OnActionExecuted가 데이터베이스 연결을 처리하기위한 올바른 위치입니까, 아니면 다른 곳에서 실행해야합니까? 저장소를 처분해도 괜찮 으면 Json (모델)이라고 부르는 순간 직렬화가 "강제로"강제로 수행되어 나중에 실패하지 않도록 할 수 있습니다.

도움 주셔서 감사합니다.

답변

1

실제 문제는 연결이 필요한 IQueryable을 반환한다는 것입니다.

적어도 쿼리를 실행하려는 시점을 결정하는 것이 좋습니다. 예를 들어 여러 번 실행할 경우를 방지하는 것이 좋습니다.

실행을 강제하면 이미 결과가 있으며 DB를 아무 문제없이 처리 할 수 ​​있습니다.

예 :

public JsonResult MyAction() 
{ 
    var entities = db.Entities.Include("Location").Where(e => e.Name != null); 
    var model = entities.Select(e => new MyModel(e)) 
         .ToList(); // Execute IQueryable to get List<MyModel> 
    return Json(model, JsonRequestBehavior.AllowGet); 
} 
+1

사실 그게 내가 그것은 단지 위치를 엔티티를 얻을 수 있지만하지 않습니다)에 ToList를 (사용하는 경우에도 정확히 사실이 아니에요. 위치는 액세스 할 때 검색되며,이 경우 직렬화가 발생할 때입니다. – willvv

+1

글쎄, 열렬한 로딩이 작동하지 않고 여전히 느린 로딩 속성으로 처리된다는 것을 의미합니다. 이것은 다른 문제입니다. 모델에서 해당 엔티티를 제거하려고 시도 했습니까? 선택한 람다에만 속성이 할당 되었습니까? – Meligy

관련 문제