Rumah >pembangunan bahagian belakang >C++ >Bagaimana Bersemangat Memuatkan Entiti Bersarang Dalam dalam Teras Rangka Kerja Entiti?

Bagaimana Bersemangat Memuatkan Entiti Bersarang Dalam dalam Teras Rangka Kerja Entiti?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 03:10:10693semak imbas

How to Eager Load Deeply Nested Entities in Entity Framework Core?

Eager Loading Deeply Nested Entiti dalam Entiti Rangka Kerja Teras

Latar Belakang

Eager Loading dalam Entiti Rangka Kerja Teras (EF Core) ialah teknik untuk pra- mengambil entiti berkaitan bersama-sama dengan entiti utama, untuk mengelakkan berbilang pertanyaan pangkalan data. Walau bagaimanapun, dalam senario tertentu, anda mungkin menghadapi had apabila cuba memuatkan entiti yang bersarang dalam.

Isunya

Pertimbangkan senario berikut:

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; }
}

public class Customer
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public int AddressId { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string PostCode { get; set; }
    public string City { get; set; }
}

Apabila anda mencuba untuk memuatkan Pesanan dengan Include(nameof(Customer)).ThenInclude(nameof(Alamat)), anda mungkin dapati bahawa sifat Address entiti Pelanggan adalah batal. Ini berlaku kerana EF Core tidak menyokong pemuatan yang tidak sabar-sabar semua entiti berkaitan bersarang secara lalai.

Penyelesaian Cadangan

Malangnya, pada masa ini tiada sokongan rasmi untuk tidak sabar-sabar memuatkan semua entiti yang sangat bersarang dalam Teras EF . Walau bagaimanapun, terdapat dua kaedah sambungan tersuai yang boleh anda gunakan untuk mencapai perkara ini:

Sertakan Sambungan:

public static IQueryable<T> Include<T>(this IQueryable<T> source, IEnumerable<string> navigationPropertyPaths)
    where T : class
{
    return navigationPropertyPaths.Aggregate(source, (query, path) => query.Include(path));
}

Sambungan GetIncludePaths:

public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue)
{
    ...
}

Contoh Penggunaan

Dalam generik anda repositori, anda boleh mengubah suai kaedah GetAllAsync seperti berikut:

public virtual async Task<IEnumerable<T>> GetAllAsync(Expression<Func<T, bool>> predicate = null)
{
    var query = Context.Set<T>()
        .Include(Context.GetIncludePaths(typeof(T));
    if (predicate != null)
        query = query.Where(predicate);
    return await query.ToListAsync();
}

Dengan menggunakan kaedah sambungan ini, anda boleh memuatkan semua entiti berkaitan bersarang untuk jenis yang ditentukan.

Atas ialah kandungan terperinci Bagaimana Bersemangat Memuatkan Entiti Bersarang Dalam dalam Teras Rangka Kerja Entiti?. 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