Eager Loading in Entity Framework Core (EF Core) ist eine Technik für vor- Abrufen verwandter Entitäten zusammen mit der primären Entität, um mehrere Datenbankabfragen zu vermeiden. In bestimmten Szenarien kann es jedoch zu Einschränkungen kommen, wenn Sie versuchen, tief verschachtelte Entitäten per Eager zu laden.
Stellen Sie sich das folgende Szenario vor:
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; } }
Wenn Sie es versuchen Um eine Bestellung mit Include(nameof(Customer)).ThenInclude(nameof(Address)) zu laden, stellen Sie möglicherweise fest, dass die Address-Eigenschaft der Customer-Entität null ist. Dies liegt daran, dass EF Core standardmäßig kein Eager Loading aller verschachtelten zugehörigen Entitäten unterstützt.
Leider gibt es derzeit keine offizielle Unterstützung für Eager Loading aller tief verschachtelten Entitäten in EF Core . Es gibt jedoch zwei benutzerdefinierte Erweiterungsmethoden, die Sie verwenden können, um dies zu erreichen:
Erweiterung einschließen:
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)); }
GetIncludePaths-Erweiterung:
public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue) { ... }
In Ihrem generischen Repository können Sie GetAllAsync ändern Methode wie folgt:
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(); }
Mithilfe dieser Erweiterungsmethoden können Sie problemlos alle verschachtelten zugehörigen Entitäten für den angegebenen Typ laden.
Das obige ist der detaillierte Inhalt vonWie lade ich tief verschachtelte Entitäten eifrig in den Entity Framework Core?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!