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
Lepaskan: 2024-12-28 03:10:10
asal
675 orang telah melayarinya

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

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

Sambungan GetIncludePaths:

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

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();
}
Salin selepas log masuk

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!

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