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
Lepaskan: 2025-01-24 22:19:08
asal
516 orang telah melayarinya

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>
Salin selepas log masuk
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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan