2016-10-13 2 views
2

Entity Framework에서 동작에 대한 설명서를 찾으려고합니다. 그것은 작동하지만,이 동작에 의존하기 전에, 나는 이것이 EF의 정상적인 동작이고 미래 버전에서 "고정"될 예상치 못한 부작용이 아닌지 확인하고자합니다. 여기에 상황이 있습니다 :동작 Entity Framework에서 설명 할 수 없습니다.

나는 꽤 심오한 오브제를 가지고 있습니다. 이 구조는 여러 레벨의 객체 컬렉션입니다 (클래스 A는 클래스 C의 콜렉션을 포함하는 클래스 B의 콜렉션을 포함하며, 여기에는 ...이 포함됩니다).

C의 일부 속성에서 요소를 필터링해야하고 전체 hierachy를로드하는 첫 번째 테스트에서 복잡한 LINQ 쿼리 (유지 관리의 어려움)가 발생하고 생성 된 SQL 쿼리가 효율적이지 않습니다. 이 모든 것을 단순화하기 위해 두 단계로 쿼리를 분할하기로했습니다. 먼저 원하는대로 필터링 된 클래스 C (및 모든 하위 항목) 컬렉션을로드 한 다음 포함 된 B의 모든 인스턴스에 대해 클래스 A와 B를로드합니다.

다음은 catch입니다.이 기술을 사용하여 B 클래스의 C 컬렉션을 수동으로 다시 채워야하지만 실제적으로 컬렉션에는 이미 컬렉션 요소가 채워져있을 것으로 예상됩니다. . intellitrace에서 SQL 쿼리를 확인했고 C의 인스턴스를 채우는 데 필요한 데이터가 두 번째 쿼리에 포함되지 않았으므로 EF가 컨텍스트의 정보에서 수행 한 유일한 논리적 결론이었습니다. BTW, 해당 컨텍스트에 대한 지연로드가 해제되어 있습니다.

EF에서이 동작이 정상입니까? 그래서, 어떻게 작동하는지 설명하는 문서에 대한 링크를 줄 수 있습니까?

using(var context = new MyContext()) 
{ 
    //Includes and where clauses are greatly simplified for the purpose of the sample 
    var filteredC = context.C.Include(x=>x.ListOfD).Include(x=>x.ListOfD.Select(y=>y.ListOfE)).Where(c=>c.Status==Status).ToList(); 

    int[] bToLoad = filteredC.Select(c=>c.IDofB).Distinct().ToArray(); 

    var listOfAAndB = context.A.Include(a=>a.ListOfB).Where(x=>x.ListOfB.Any(y=>bToLoad.Contains(y.ID))).ToList(); 

    //At this step, I expected B.ListOfC to be empty but it's somehow populated 
} 

감사

+1

어떤 버전의 EF도 참고 하시겠습니까? –

+0

게으른로드를 사용하고 있습니까? – Gavin

+0

게으른 로딩이 없음 (질문에 지정됨) –

답변

3

이것은 DbContext 수명주기의 표준 동작입니다 :

다음은이를 설명하는 조각이다. 솔직하게이 기능을 문서화 한 문서에 연결할 수는 없지만 어떻게 작동하는지 설명 할 수 있습니다.

EF 컨텍스트는 상태 저장이며 이미 페치 된 모든 엔터티를 추적합니다. 또한 DB의 엔티티와 엔티티 모델 간의 관계에 대해서도 알고 있습니다.

따라서 해당 개체와 직접적인 관계가있는 새 개체를 가져 오는 경우 (C는 B에 대한 외래 키를 가짐) 탐색 속성은 컨텍스트로 채워집니다. 이것은 이미 가져온 객체에 대한 DB에 대한 Lazy 로딩 쿼리를 명시 적으로 피하려고하기 때문에 버그가 아닌 기능입니다.

+0

이 기능의 다른 부분은 .. A의 모든 탐색 속성 B를로드 한 경우이 기능이 없으면 EF가 실제로 B를 A에 추가 한 다음 SaveChanges()가 관계를 생성하려고 시도하고 모든 종류의 문제가 발생한다고 가정합니다. 코드/유지 관리의 관점에서 보면 이것이 바람직한 행동입니다. –

+0

명확한 설명을 위해 H. Lowette과 @Erik Philips에게 감사 드리며, 이에 관한 문서를 발견 한 경우 나중에 참조 할 수 있도록 추가하십시오. –

관련 문제