2009-09-09 3 views
17

전 Entity Framework 및 ASP.Net MVC의 초보자입니다. (.Net 2.0, ADO.Net 및 WebForms에 대한 경험이 있습니다.)Entity Framework - "엔터티"개체를 인스턴스화하는 방법

내 현재의 의심은 내 Entities 개체를 인스턴스화하는 방식에서 비롯됩니다. 기본적으로

내 컨트롤러에이 일을 해요 :

public class PostsController : Controller { 

    private NorthWindEntities db = new NorthWindEntities(); 

    public ActionResult Index() { 
      // Use the db object here, never explicitly Close/Dispose it 
    } 
} 

나는 이것이 올바른 방법이라고 가정 저에게 충분한 권한을 보였다 일부 MSDN 블로그에 그것을 발견하기 때문에 내가 이런 식으로하고 있어요 .
그러나 나는 이것에 대해 꽤 쉽지 않습니다. 연결을 필요로 매 방법

using (NorthWindEntities db = new NorthWindEntities() { 
} 

을, 그 방법은 다른 사람을 호출하는 경우 즉, 같은 DB를 통과 할 것입니다, 그것을해야합니다 : 그것은 나에게 코드를 많이 절약 할 수 있지만, 나는 일을 사용 해요 매개 변수 이것은 Linq-to-SQL이 존재하기 전에 연결 객체로 모든 것을 한 것입니다.

나에게 불안감을주는 또 다른 단점은 NorthWindEntities가 IDisposable을 구현한다는 것입니다. 이는 관습에 따라 Dispose() 메서드라고해야하며, 그렇지 않습니다.

이 점에 대해 어떻게 생각하십니까?
내가하는 것처럼 Entities 개체를 인스턴스화하는 것이 맞습니까? 각 쿼리에 대해 열거 나 닫음으로써 연결을 처리해야합니까?
또는 using() 절을 사용하여 명시 적으로 삭제해야합니까?

감사합니다.

답변

21

컨트롤러 자체는 IDisposable을 구현합니다. 따라서 Dispose를 재정의하고 컨트롤러가 인스턴스화 될 때 초기화하는 객체 컨텍스트와 같은 객체를 삭제할 수 있습니다.

컨트롤러는 단일 요청으로 만 작동합니다. 따라서 액션 내부에서 하나의 객체 컨텍스트를 갖는 것은 컨트롤러의 전체 컨텍스트 수와 같습니다. 1.

두 가지 방법의 가장 큰 차이점은 뷰가 렌더링되기 전에 작업이 완료된다는 것입니다. 따라서 액션 내에서 using 문에 ObjectContext를 만들면 뷰가 렌더링되기 전에 ObjectContext가 삭제됩니다. 따라서 작업이 완료되기 전에 필요한 컨텍스트에서 무엇이든 읽은 것이 좋습니다. 뷰에 전달하는 모델이 IQueryable과 같은 일부 지연 목록이면 뷰가 렌더링되기 전에 컨텍스트를 폐기해야하므로 뷰에서 IQueryable을 열거 할 때 예외가 발생합니다.

대조적으로 컨트롤러가 초기화 될 때 ObjectContext를 초기화하거나 (동작이 실행될 때 지연 초기화 코드를 작성하여) ObjectContext를 Controller.Dispose에 삭제하면 컨텍스트는 여전히 유지됩니다 보기가 렌더링 될 때 주위에 있어야합니다. 이 경우 IQueryable을보기에 전달하는 것이 안전합니다. 컨트롤러는 뷰가 렌더링 된 직후 처리됩니다.

마지막으로, 컨트롤러가 Entity Framework를 전혀 인식하지 못한다는 사실을 지적하지 않았다면 나는 좌절 할 것입니다. 모델과 저장소 패턴에 대해 별도의 어셈블리를 사용하여 컨트롤러가 모델과 대화하게하십시오. 구글 검색은 이것에 대해 꽤 많이 나타날 것이다.

+0

좋습니다. 질문은 ... 잘못하고 있습니까? 정말 엔티티 객체를 처리해야합니까? 내가하지 않으면 어떻게됩니까? SQL Server에 연결이 새어 나옵니까? –

+1

ObjectContext.Dispose가 많이 수행하지 않습니다 (Reflector 참조). 그러나 그것이 변할 수 있다고 가정하는 것은 합리적입니다. 당신은 그것을 처분해야합니다. –

3

여기에 좋은 점이 있습니다.ObjectContext의 수명은 어느 정도입니까? 모든 패턴 및 연습 책 (Dino Esposito의 Microsoft-NET-Architecting-Applications과 같은)은 DataContext가 길거나 캐시되어서는 안된다는 것을 알려줍니다.

저는 모든 컨트롤러에 대해 한 번 ObjectContext가 시작되는 ControllerBase 클래스 (저는 MVC 구현을 인식하지 못해서)를 가지고 있지 않은지 궁금합니다. 특히 Identity Map Pattern에 대해 생각해보십시오. Entity Framework에서 이미 구현되었습니다. 다른 컨트롤러를 PostsController로 호출해야하지만, 여전히 동일한 Context에서 작동하고 성능이 향상됩니다.