1

나는 나의 컨트롤러에서이 코드를 가지고 :ASP.NET MVC + EF 성능

public class MyController : Controller 
{ 
    private readonly IMyRepository myRepository; 

    public MyController() : this(new MyRepository()) 
    {} 

    public MyController(IMyRepository myRepository) 
    { 
    this.myRepository = myRepository; 
    } 

    public ActionResult Index() 
    { 
    return View(myRepository.GetData()); 
    } 
} 

MyRepository 데이터 작업 EF를 사용합니다. 사용자가 MyRepository의이 페이지 인스턴스를로드 할 때마다 만듭니다. 즉, EF 컨텍스트가 생성되고 Fluent API 코드가 실행 중임을 의미합니다 (OnModelCreating 메서드).

사용자가 페이지를로드 할 때마다 EF 컨텍스트를 만들지 못할 가능성이 있습니까?

+1

정말이에요? 실제로 성능 영향을 측정 했습니까? –

+0

http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/ –

답변

7

MyRepository는 데이터 조작에 EF를 사용합니다. 사용자가로드 할 때마다 MyRepository의 페이지 인스턴스가 생성됩니다. 즉, EF 컨텍스트는 생성 및 Fluent API 코드가 실행 중임을 나타냅니다 (OnModelCreating 메서드).

틀렸어. OnModelCreating 메서드에 중단 점을 넣습니다. 이 메서드는 응용 프로그램이로드 될 때 한 번만 발생합니다. 프로젝트를 다시 빌드하면 바이너리 dll이 앱 도메인으로 다시로드되기 때문에 중단 점에 다시 충돌합니다. 그러나 응용 프로그램을 계속 실행하고 컨트롤러 작업을 두 번 반복하면 (다시 빌드하지 않고) OnModelCreating이 두 번째로 치지 않습니다. Like Serg Rogovtsev says, EF는 OnModelCreating 중에 모델을 만든 후에 스키마를 의미하는 모델을 캐시합니다.

내가 유일한 Serg Rogovtsev's answer에 대한 이의 제기는 결코 DbContext의 싱글 톤 인스턴스를 만들지 않는다는 것입니다. 대신 HttpContext 당 하나의 인스턴스 (웹 요청 당 a.k.a.)를 사용해야합니다. 싱글 톤으로 사용하고 동시성을 사용하도록 설정하면 결국 DbConcurrencyExceptions가 앱에서 사라지는 것을 볼 수 있습니다. DI/IoC를 사용하고 요청 응답주기의 시작/끝 부분에서 DbContext 인스턴스를 만들거나 처리합니다. 그것이 최선의 방법입니다. new MyDbContext() 인스턴스를 생성하는 오버 헤드에 대해 걱정하지 마십시오. EF가 첫 번째 건설 중 초기화 (예열) 한 후, 미래의 건설은 상당히 저렴합니다.

+0

응용 프로그램마다 하나의 DbContext 인스턴스를 사용하는 동시성 문제 (여러 가지 다른 의미)가 있습니다. (언급하지 않은 것은 잘못되었습니다.) –

+0

전적으로 동의합니다.싱글 톤 Scoped 컨텍스트와의 동시성 오류 외에도이 접근법에는 주요 성능 문제가 있습니다. EF는 가장 중요한 작업에서 모든 추적 된 엔터티를 열거합니다. 단독 추적 컨텍스트를 사용하는 경우이 추적 된 컬렉션을 지우지 않은 것일 수 있습니다. 즉, 앱 실행 시간이 오래 걸리면 앱 속도가 느려집니다. 큰 문맥에서 EF가 느린 이유는 http://blog.staticvoid.co.nz/2012/05/entityframework-performance-and.html을 참조하십시오. –

+0

내 테스트에서 DbContext 생성은 엄청나게 빠릅니다 (여러 번 할 때). 실제 작업과 비교할 때 성능 메트릭에 너무 빨리 등록하지 않아도됩니다. http://blog.staticvoid.co.nz/2012/03/entity-framework-comparative. 얼마나 빨리 EF가 실행되는지에 대한 자세한 내용은 html로 –

0

컨트롤러를 변경하여 게으른 방식으로 저장소의 인스턴스를 만들 수 있습니다. 예를 들어 Lazy < T > 클래스를 사용할 수 있습니다.

+1

은 게으른 접근 방식처럼 들립니다. – Har

+1

하하, 우스운 이야기 :-) – Maarten

+0

우스꽝스런 말에 대한 큰 반응은 +1. – Har

2

질문에 답하십시오 : 저장소의 싱글 톤을 만들거나 단일 인스턴스를 보유 할 DI 컨테이너를 사용할 수 있습니다.

하지만 요점 : OnModelCreating 안에 중단 점을 설정하면 응용 프로그램 인스턴스 당 한 번만 호출된다는 것을 알 수 있습니다. EntityFramework는 매우 효과적인 모델 캐싱을 사용합니다. 따라서 EF 컨텍스트 생성으로 인한 성능 저하는 걱정할 필요가 없습니다.

0

데이터를 검색하거나 업데이트 한 후에 EF 컨텍스트를 처리하는 것이 가장 좋습니다.