Rumah >pembangunan bahagian belakang >C++ >Kenapa sifat navigasi teras EF Null sehingga dimuat secara eksplisit, dan bagaimana saya dapat secara konsisten mengisi mereka?
teras EF menangguhkan masalah nilai kosong dan penyelesaian atribut navigasi
Penerangan Masalah
Pertimbangkan model berikut:
Tentukan hubungan dalam kaedah
<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>dbContext:
OnModelCreating
<code class="language-csharp">modelBuilder.Entity<Mutant>() .HasOne(m => m.OriginalCode) .WithMany(oc => oc.Mutants) .HasForeignKey(m => m.OriginalCodeId) .OnDelete(DeleteBehavior.Restrict);</code>pada asalnya kosong. Walau bagaimanapun, jika anda menyemak
sebelum menanyakan mutan, atribut OriginalCode
akan diisi. OriginalCode
OriginalCode
Analisis sebab
"Data berkaitan beban" dokumen teras EF menjelaskan tingkah laku ini:
Rangka kerja entiti teras tidak menyokong pemuatan kelewatan, jadi biasanya, atribut navigasi akan kosong sebelum anda memuatkannya melalui pra -beban atau secara eksplisit memuatkannya.
Walau bagaimanapun, bahagian "pra -load" mengandungi perkara berikut:
Petua
Teras Rangka Kerja Entiti secara automatik akan membaiki sebarang atribut navigasi yang telah dimuatkan ke entiti lain dalam contoh konteks. Oleh itu, walaupun anda tidak mempunyai data eksplisit yang mengandungi atribut navigasi, jika beberapa atau semua entiti yang berkaitan telah dimuatkan sebelum ini, atribut masih boleh diisi.menyelesaikan masalah pertama (atribut navigasi kosong):penyelesaian
kaedah menggunakan data berkaitan memuatkan yang tersedia, seperti pra -beban:
menyelesaikan masalah kedua (pra -beban entiti yang berkaitan menyebabkan atribut navigasi diisi):
Tingkah laku ini "direka" dan tidak boleh dikawal. Untuk mengelakkan ini:
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>Gunakan contoh DBContext baru untuk setiap pertanyaan.
Gunakan tanpa pertanyaan penjejakan ().
AsNoTracking()
Tandakan semua atribut navigasi sebagai Pasang beg nuget. Gunakan Dayakan pemuatan kelewatan.
Melalui kaedah di atas, anda dapat menguruskan atribut navigasi secara berkesan dalam teras EF untuk memuatkan, mengelakkan masalah kekosongan dan meningkatkan ramalan kod.
Atas ialah kandungan terperinci Kenapa sifat navigasi teras EF Null sehingga dimuat secara eksplisit, dan bagaimana saya dapat secara konsisten mengisi mereka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!