2016-07-19 4 views
0

(7) 나는 다음과 같은 요소를 가지고 : Entity Framework 쿼리가 자식 속성을 다른 변수로로드하고 있습니다. 왜? 엔티티 프레임 워크 코어를 사용

public class Person { 
    public Int32 Id { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address { 
    public Int32 PersonId { get; set; } 
    public String City { get; set; } 
} 

그런 다음 나는 두 번째 줄에 중단 점으로 다음과 같은 쿼리를 실행했습니다.

List<Context.Person> a = context.Persons.ToList(); 

List<Context.Person> b = context.Persons.Include(x => x.Address).ToList(); 

"a"변수를 검사 할 때 각 목록 항목의 주소는 null입니다. 이는 첫 번째 쿼리의 주소가 포함되지 않았기 때문에 의미가 있습니다.

두 번째 쿼리를 실행할 수 있도록 허용하고 "b"목록 항목의 주소가 널 (null)과 다른 주소를 가지고 있다는 것을 알았습니다.

"b"를 실행하면 "a"항목의 주소가로드됩니다.

왜? 이 문제를 피할 수 있습니까?

몇 가지 테스트를 만들고 있는데 이것은 피하고 싶습니다.

+0

문제는 당신이 adresses을 포함로 상황이 더 크게된다, 따라서 a.Address 속성도 가득합니다. 다른 컨텍스트에서 주소를 추가하십시오. 아마도 지연로드를 비활성화하면 도움이 될 수도 있습니다. – DevilSuichiro

+0

지연로드가 Entity Framework Core에 존재하지 않습니다. 2 컨텍스트를 사용하지 않고이 문제를 해결할 수있는 다른 방법이 있습니까? 내 목록에는 8 개의 레코드와 각각 하나의 주소 만 있습니다. 나는이 일을하는 것이 이상하다는 것을 안다. –

답변

1

왜? 엔티티의 형태를 돌려 때문에 기본 쿼리에 의해

은 경우에 Person 객체 인스턴스가 같은 맥락에 의해 두 통화 사이에 공유되는 의미 Tracking queries이다. 또한 참조 유형이므로 나중에 쿼리에 의해로드 된 정보가 이전 쿼리의 결과에도 표시됩니다.

이 문제를 방지 할 수 있습니까?

당신은 No-tracking queries를 사용할 수 있습니다

var a = context.Persons.AsNoTracking().ToList();