Rumah >pembangunan bahagian belakang >C++ >Mengapa Perhubungan Teras EF Batal Sehingga Dimuatkan Secara Eksplisit?

Mengapa Perhubungan Teras EF Batal Sehingga Dimuatkan Secara Eksplisit?

Patricia Arquette
Patricia Arquetteasal
2025-01-24 22:19:08520semak imbas

Why are EF Core Relationships Null Until Explicitly Loaded?

Pemuatan malas Teras EF menyebabkan atribut perhubungan menjadi kosong

Soalan:

Apabila mendapatkan semula entiti yang mengandungi data berkaitan, EF Core pada mulanya akan mengembalikan perhubungan kosong sebelum melakukan pemuatan eksplisit.

Adegan:

Pertimbangkan kelas entiti berikut:

<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>
Hubungan

dikonfigurasikan dalam kaedah OnModelCreating:

<code class="language-csharp">modelBuilder.Entity<Mutant>()
    .HasOne(m => m.OriginalCode)
    .WithMany(oc => oc.Mutants)
    .HasForeignKey(m => m.OriginalCodeId);</code>

Soalan:

Pada mulanya, sifat OriginalCode entiti Mutant yang diambil melalui pertanyaan adalah batal. Walau bagaimanapun, mengakses koleksi OriginalCodes dalam pertanyaan berasingan mengisi atribut OriginalCode.

Penjelasan:

EF Core tidak menyokong pemuatan malas secara lalai. Perhubungan tidak akan dimuatkan dengan penuh semangat melainkan diminta secara eksplisit. Dalam senario pertama, memandangkan hubungan OriginalCode tidak disertakan secara eksplisit dalam pertanyaan, ia kekal batal.

Penyelesaian:

Terdapat dua cara untuk menyelesaikan tingkah laku ini:

1. Tidak sabar-sabar memuatkan:

Gunakan Include() untuk memasukkan data yang berkaitan secara eksplisit dalam pertanyaan:

<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>

2. Gunakan pemuatan malas:

Bermula dengan EF Core 2.1, pemuatan malas disokong. Walau bagaimanapun, ini memerlukan mendayakan dan menggunakan atribut navigasi maya melalui 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>

Sekat autoisi:

Jika anda tidak memerlukan autopopulasi perhubungan, anda boleh menghalangnya dengan menggunakan tika DbContext baharu untuk setiap pertanyaan atau menggunakan AsNoTracking() untuk pertanyaan tanpa jejak.

Atas ialah kandungan terperinci Mengapa Perhubungan Teras EF Batal Sehingga Dimuatkan Secara Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn