>백엔드 개발 >C++ >명시적으로 로드될 때까지 EF 핵심 관계가 Null인 이유는 무엇입니까?

명시적으로 로드될 때까지 EF 핵심 관계가 Null인 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-24 22:19:08565검색

Why are EF Core Relationships Null Until Explicitly Loaded?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.