2014-05-14 5 views
0

나는 this question과 매우 유사한 시나리오를 가지고 있지만 좀 더 복잡한 것으로하려고합니다. 테이블 당 유형 EF 탐색 속성로드 상속 시나리오

내가 기본적으로 케이스의 목록, 다른 유형의 하나 하나가, 다시 정리해 보면 :

Case -> CaseA 
Case -> CaseB 
Case -> CaseC 

모든 파생를 Case 클래스 내가 포함시켜야 하나 개 이상의 탐색 속성이 있습니다

Case -> CaseA -> Employee 
Case -> CaseB -> List<Something> 
Case -> CaseC -> List<SomethingElse> 

이제는 대용량의 switch 문을 사용할 수 있지만 이처럼 영리한 것을 찾고 있습니다.

foreach(var myCase in ListOfCases) 
{ 
    context.LoadAll(myCase); // <- THIS! 
    context.Entry(myCase).LoadAllProperties() // <- OR THIS... 
    // etc. etc. 
} 

물론이 방법은 존재하지 않으므로 누구나 비슷한 문제가 있었는지 궁금해하고 있으며이를 해결할 수있는 좋은 방법이 무엇인지 궁금합니다.

감사합니다.

+0

이러한 모든 사례 유형을 한 번에 어떻게 쿼리하고 있습니까? 기본 케이스를 쿼리하면 하위 케이스 멤버에 액세스 할 수 없습니다. –

+0

안녕하세요 에이전트, 그게 정확히 내가 해결하려고하는 문제는 ... :/기본 거기에 아이들이 무시하고 일부 어린이 필드를 사용하는 방법입니다 ... – Tallmaris

+0

나는 당신이로드해야 할 것 같아요 참조 된 질문과 같이 유형별로 각각의 경우. 커다란 스위치이지만 컨텍스트 클래스의 함수입니다. –

답변

0

결국 솔루션은 정말 간단했습니다. 아무 것도하지 마십시오! :)

기본적으로 개체 계층 구조가 올바르게 설정되어 있고 네비게이션 속성 (및 컬렉션)에 모두 virtual 수정자를 사용하여 LazyLoading을 사용하도록 설정할 수있는 경우 EF는 개체 계층 구조로 다이빙하여 SELECT 제 동안로드되지 :

public CasesDbContext() { 
    Configuration.LazyLoadingEnabled = true; 
    Configuration.ProxyCreationEnabled = true; 
} 

하고, 예를 들면이 방법이다

var result = new List<CaseViewModel>(); 
var cases = _casesRepository.All; 
foreach (var customCase in cases) { 
    result.Add(new CaseViewModel() { 
     Complete = customCase.IsComplete(), // <- at this point, the customCase is 
              // the derived implementation 
              // but the full hierarchy is missing 
    }); 
} 

이 파생 클래스의 예이다 :,

public class CaseB : Case { 
    public int ReferenceId { get; set; } 
    public virtual Reference Reference { get; set; } // <- "virtual" here is important! 

    protected override bool IsComplete() { 
     return Reference.Name == "Tallmaris"; // <- at this point the EF 
               // will load the Reference. 
    } 
} 
다른주의 사항은 엔티티 집합을 반복하면서 There is already an open DataReader associated with this Command which must be closed first과 같은 오류가 발생할 수 있지만 참조를로드하는 것입니다. 해결 방법은 반복하기 전에 ToList()을 사용하거나 MultipleActiveResultSets을 연결 문자열에 사용하는 것입니다 ( his answer here의 @Ladislav에 대한 크레디트).