EF Core 지연 로딩으로 인해 관계 속성이 비어 있음
질문:
관련 데이터가 포함된 엔터티를 검색할 때 EF Core는 명시적 로드를 수행하기 전에 처음에 빈 관계를 반환합니다.
장면:
다음 엔터티 클래스를 고려하세요.
<code class="language-csharp">public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { public long Id { get; set; } public virtual List<Mutant> Mutants { get; set; } }</code>
관계는 OnModelCreating
메소드에서 구성됩니다:
<code class="language-csharp">modelBuilder.Entity<Mutant>() .HasOne(m => m.OriginalCode) .WithMany(oc => oc.Mutants) .HasForeignKey(m => m.OriginalCodeId);</code>
질문:
처음에는 쿼리를 통해 검색된 Mutant 엔터티의 OriginalCode
속성이 null입니다. 그러나 별도의 쿼리로 OriginalCodes
컬렉션에 액세스하면 OriginalCode
속성이 채워집니다.
설명:
EF Core는 기본적으로 지연 로딩을 지원하지 않습니다. 명시적으로 요청하지 않는 한 관계는 즉시 로드되지 않습니다. 첫 번째 시나리오에서는 OriginalCode
관계가 쿼리에 명시적으로 포함되지 않았으므로 null로 유지됩니다.
해결책:
이 문제를 해결하는 방법에는 두 가지가 있습니다.
1. 즉시 로딩:
Include()
을 사용하여 쿼리에 관련 데이터를 명시적으로 포함합니다.
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
2. 지연 로딩 사용:
EF Core 2.1부터 지연 로딩이 지원됩니다. 그러나 이를 위해서는 UseLazyLoadingProxies()
을 통해 가상 탐색 속성을 활성화하고 사용해야 합니다.
<code class="language-csharp">modelBuilder.UseLazyLoadingProxies(); public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } }</code>
자동완성 차단:
관계 자동 채우기가 필요하지 않은 경우 각 쿼리에 대해 새 DbContext 인스턴스를 사용하거나 추적 없는 쿼리에 AsNoTracking()
을 사용하여 이를 방지할 수 있습니다.
위 내용은 명시적으로 로드될 때까지 EF 핵심 관계가 Null인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!