EF Core 지연 로딩 탐색 속성
질문:
EF Core(Entity Framework Core) 모델에서 탐색 속성은 관련 엔터티에 직접 액세스하기 전에 처음에 null을 반환합니다.
모델:
<code class="language-csharp">public class Mutant { ... public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { ... public virtual ICollection<Mutant> Mutants { get; set; } }</code>
질문:
돌연변이를 검색할 때 OriginalCode 탐색 속성이 비어 있습니다.
<code class="language-csharp">var mutants = db.Mutants.ToList(); mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为True</code>
역동적인 관계 채우기:
단, 관련 OriginalCode 엔터티를 쿼리하는 경우:
<code class="language-csharp">var originalCodes = db.OriginalCodes.ToList();</code>
돌연변이의 OriginalCode 탐색 속성이 자동으로 채워집니다.
<code class="language-csharp">mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为False</code>
설명:
EF Core의 사전 로드 메커니즘은 컨텍스트에 로드된 관련 엔터티의 탐색 속성을 자동으로 채웁니다. 두 번째 경우에는 OriginalCodes가 검색되면 해당 돌연변이도 컨텍스트에 로드되므로 해당 탐색 속성이 채워집니다.
해결책:
이 동작을 제어하려면 사전 로드와 같은 명시적인 로드 방법을 사용해야 합니다.
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
또는 자동 완성을 방지하려면 새 DbContext 인스턴스 또는 비추적 쿼리를 사용하세요.
업데이트:
EF Core v2.1에서는 이제 지연 로딩이 지원됩니다. 이를 활성화하려면 탐색 속성을 가상으로 표시하고, Microsoft.EntityFrameworkCore.Proxies를 설치하고, UseLazyLoadingProxies를 호출하세요.
위 내용은 EF Core Navigation Properties가 관련 엔티티에 직접 액세스 할 때까지 왜 unull인가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!