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