Molti a molti mapping delle relazioni in EF Core

Ho un problema con molte e molte relazioni nel core EF. Ho le seguenti classi di modelli:

public class Meal { public int Id { get; set; } [Required] public int Insulin { get; set; } public MealType Type { get; set; } public ICollection MealFoods { get; set; } public Meal() { MealFoods = new Collection(); } } public class Food { public int Id { get; set; } [StringLength(255)] public string Name { get; set; } [Required] public int Carbohydrates { get; set; } public ICollection MealFoods { get; set; } public Food() { MealFoods = new Collection(); } } public class MealFood { public int MealId { get; set; } public Meal Meal { get; set; } public int FoodId { get; set; } public Food Food { get; set; } } 

Ho la seguente class di risorse API:

 public class MealResource { public int Id { get; set; } public int Insulin { get; set; } public MealType Type { get; set; } public ICollection Foods { get; set; } public MealResource() { Foods = new Collection(); } } 

Ho eseguito la mapping nel mio DbContext:

 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasKey(mf => new { mf.MealId, mf.FoodId }); modelBuilder.Entity().HasOne(mf => mf.Meal).WithMany(m => m.MealFoods).HasForeignKey(mf => mf.MealId); modelBuilder.Entity().HasOne(mf => mf.Food).WithMany(f => f.MealFoods).HasForeignKey(mf => mf.FoodId); } 

Ho un problema con questa chiamata:

 var meals = await context.Meals.Include(m => m.MealFoods).ToListAsync(); 

Questo restituisce quasi tutto ciò di cui ho bisogno, tranne le proprietà di navigazione di MealFoods

Il motivo per cui voglio queste proprietà, perché voglio fare la seguente mapping:

 CreateMap().ForMember(mr => mr.Foods, opt => opt.MapFrom(x => x.MealFoods.Select(y => y.Food).ToList())); 

Ho già trovato questo: Automapper molti a molti mapping

ma (forse non ottengo qualcosa) questo non funziona perché la proprietà chiamata Food in MealFood è nulla.

Spero di non aver spiegato troppo complesso.

Quando si include la proprietà di navigazione, EF Core automaticamente riempie la proprietà di navigazione inversa, ad esempio, Meal.MealFoods riempirà automaticamente MealFood.Meal , incluso Food.MealFoods automaticamente MealFood.Food ecc. Per popolare altre proprietà di navigazione che è necessario utilizzare ThenInclude . Per esempio

 var meals = await context.Meals .Include(m => m.MealFoods) .ThenInclude(mf => mf.Food) // <-- .ToListAsync(); 

o

 var foods = await context.Foods .Include(f => f.MealFoods) .ThenInclude(mf => mf.Meal) // <-- .ToListAsync();