2013-04-27 2 views
2

POCO 엔터티 및 지연로드 프록시를 사용하여 Entity Framework 5를 사용합니다. 대부분의 경우 후속 작업에 필요한 모든 항목을 열심히로드하지만 경우에 따라 관련 항목을 검색하고 탐색하기 위해 지연로드를 사용합니다. 이 방법은 잘 작동하지만 응용 프로그램을 감사하고 열심히로드 최적화를 수행 할 기회를 놓치지 않고 (또는 적어도 지연로드를 과도하게 사용하지 않아도 됨) 놓치지 않도록하십시오.로그 지연로드 작업

저는 현재이 목적을 위해 SQL 프로파일 러를 사용하고 있지만 열정적/명시 적로드와 지연로드 쿼리를 구별하기가 쉽지 않으므로 지루합니다.

지연로드 작업을 로그 할 수 있습니까? 기본적으로 저장소 쿼리가 실행될 때마다 (즉 명시 적으로 쿼리를 실행할 때가 아니라) 지연로드의 결과로 Debug.Print를 사용하고 싶습니다.

지연로드의 장점 (또는 부족)에 대한 설명을 제공하지 마십시오. 상당한 규모의 응용 프로그램에서 작업 중이며이 단계에서 전환하는 것은 매우 위험 할 수 있습니다.

답변

0

이 도구를 사용합니다. https://code.google.com/p/mvc-mini-profiler/ Nuget에서 구입할 수 있습니다. MVC 및 데스크톱 응용 프로그램 (명령 응용 프로그램 용 미니 프로파일 러 검색)에서 사용할 수 있습니다. SQL, 실행 시간 및 호출 된 코드를 알려줍니다. 비어 있는. 우수한 도구.

어떤 쿼리가 지연로드되었는지는 알 수 없지만 코드의 특정 부분을 대상으로 지정할 수 있으므로 어떤 코드가 어떤 코드를 호출하는지 볼 수 있어야합니다.

0

I이 라이브러리 체크 아웃 제안 : https://github.com/jamesmanning/EntityFramework.LazyLoadLoggingInterceptor

더 구체적 this file는 지연로드 쿼리를 검출 할 수있는 엔티티 DbCommandInterceptor 프레임 워크의 구현을 도시한다. 핵심에서이 해킹을 포함하는 ReaderExecuting 메소드를 구현합니다.

 // unfortunately not a better way to detect whether the load is lazy or explicit via interceptor 
     var stackFrames = new StackTrace(true).GetFrames(); 
     var stackMethods = stackFrames?.Select(x => x.GetMethod()).ToList(); 

     var dynamicProxyPropertyGetterMethod = stackMethods? 
      .FirstOrDefault(x => 
       x.DeclaringType?.FullName.StartsWith("System.Data.Entity.DynamicProxies") == true && 
       x.Name.StartsWith("get_")); 
     if (dynamicProxyPropertyGetterMethod == null) 
     { 
      // not in a lazy-load context, nothing to do 
      return; 
     }