문제

저는 Entity Framework와 ASP.Net MVC에 대해 깊이 이해하지 못한 채 대부분 튜토리얼을 통해 배운 완전 초보자입니다.(저는 .Net 2.0, ADO.Net 및 WebForms에 대한 경험이 있습니다)

현재 의심스러운 점은 엔터티 개체를 인스턴스화하는 방식에서 비롯됩니다.

기본적으로 컨트롤러에서 이 작업을 수행합니다.

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() 절을 사용하여 명시적으로 처리해야 합니까?

감사해요!

도움이 되었습니까?

해결책

컨트롤러 자체는 IDisposable을 구현합니다.따라서 Dispose를 재정의하고 컨트롤러가 인스턴스화될 때 초기화하는 모든 항목(예: 개체 컨텍스트)을 삭제할 수 있습니다.

컨트롤러는 단일 요청 동안만 지속됩니다.따라서 액션 내부에서 using을 갖고 전체 컨트롤러에 대해 하나의 객체 컨텍스트를 갖는 것은 정확히 동일한 수의 컨텍스트를 갖는 것입니다.1.

이 두 가지 방법의 가장 큰 차이점은 뷰가 렌더링되기 전에 작업이 완료된다는 것입니다.따라서 작업 내부의 using 문에서 ObjectContext를 생성하면 뷰가 렌더링되기 전에 ObjectContext가 삭제됩니다.따라서 작업이 완료되기 전에 필요한 컨텍스트에서 무엇이든 읽는 것이 좋습니다.뷰에 전달하는 모델이 IQueryable과 같은 일부 게으른 목록인 경우 뷰가 렌더링되기 전에 컨텍스트를 삭제하게 되어 뷰가 IQueryable을 열거하려고 할 때 예외가 발생하게 됩니다.

이와 대조적으로 Controller가 초기화될 때 ObjectContext를 초기화하고(또는 작업이 실행될 때 초기화되도록 하는 지연 초기화 코드를 작성) Controller.Dispose에서 ObjectContext를 삭제하면 컨텍스트는 여전히 주변에 있습니다. 뷰가 렌더링됩니다.이 경우 IQueryable을 뷰에 전달하는 것이 안전합니다.컨트롤러는 뷰가 렌더링된 직후에 삭제됩니다.

마지막으로, 컨트롤러가 Entity Framework를 전혀 인식하지 못하도록 하는 것이 아마도 나쁜 생각일 수 있다는 점을 지적하지 않았다면 안타까울 것입니다.컨트롤러가 모델과 통신하도록 하려면 모델과 저장소 패턴에 대해 별도의 어셈블리를 사용하는 방법을 살펴보세요.Google 검색에 이것에 대한 내용이 꽤 많이 나올 것입니다.

다른 팁

당신은 여기서 좋은 지적을하고 있습니다. ObjectContext는 얼마나 오래 살아야합니까? 모든 패턴과 연습 서적 (Dino esposito 's와 같은 Microsoft-Net-ArachiteCting-Applications) DataContext는 오래 살지 않아야하며 캐시되어야한다고 말하십시오.

귀하의 경우 컨트롤러베이스 클래스 (MVC 구현을 알지 못하고 있지 않으므로 모든 컨트롤러에 대해 ObjectContext가 한 번 시작되는지 궁금합니다. 특히 생각에 대해 생각하십시오 신원 맵 패턴, 그것은 이미 Entity Framework에서 구현되었습니다. Postscontroller로 다른 컨트롤러를 호출해야하더라도 여전히 동일한 컨텍스트에서 작동하고 성능을 향상시킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top