Rumah >pembangunan bahagian belakang >C++ >Kenapa sifat navigasi teras EF Null sehingga dimuat secara eksplisit, dan bagaimana saya dapat secara konsisten mengisi mereka?

Kenapa sifat navigasi teras EF Null sehingga dimuat secara eksplisit, dan bagaimana saya dapat secara konsisten mengisi mereka?

Barbara Streisand
Barbara Streisandasal
2025-01-24 22:25:09724semak imbas

Why are EF Core navigation properties null until explicitly loaded, and how can I consistently populate them?

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

Apabila menanyakan mutan, atribut
<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.

penyelesaian

menyelesaikan masalah pertama (atribut navigasi kosong):

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 ().

ef core v2.1 dan kemas kini versi yang lebih tinggi:
  • EF Core v2.1 Sokongan Kelewatan Sokongan, tetapi ia tidak diaktifkan secara lalai. Untuk membolehkannya:
  • 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!

    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