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.
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.
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) { ... }
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!