Entity Framework Core (EF Core) での一括読み込みは、事前に実行するための手法です。複数のデータベース クエリを回避するために、主エンティティとともに関連エンティティを取得します。ただし、特定のシナリオでは、深くネストされたエンティティを積極的にロードしようとすると制限が発生する可能性があります。
次のシナリオを考慮してください。
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; } }
試行するときInclude(nameof(Customer)).ThenInclude(nameof(Address)) を使用して注文をロードすると、Customer の Address プロパティがエンティティが null です。これは、EF Core がデフォルトですべての入れ子になった関連エンティティの一括読み込みをサポートしていないために発生します。
残念ながら、現時点では、EF Core のすべての深く入れ子になったエンティティの一括読み込みは公式にサポートされていません。 。ただし、これを実現するために使用できるカスタム拡張メソッドが 2 つあります:
Include Extension:
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 Extension:
public static IEnumerable<string> GetIncludePaths(this DbContext context, Type clrEntityType, int maxDepth = int.MaxValue) { ... }
汎用リポジトリでは、GetAllAsync メソッドを次のように変更できます。
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(); }
これらの拡張メソッドを使用すると、指定された型のネストされた関連エンティティをすべて積極的に読み込むことができます。
以上がEntity Framework Core に深く入れ子になったエンティティを積極的に読み込むにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。