Получение объектов "многие ко многим" с помощью Entity Framework 7
У меня есть следующая установка отношения "многие ко многим", показанная здесь диаграммой базы данных:
Они представлены следующими классами POCO, из которых база данных была сначала создана с использованием кода Entity Framework:
public class ExerciseCategory
{
public int ExerciseId { get; set; }
public Exercise Exercise { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
public class Exercise
{
public int Id { get; set; }
public string Name { get; set; }
public List<ExerciseCategory> ExerciseCategories { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public List<ExerciseCategory> ExerciseCategories { get; set; }
}
Теперь мне нужно получить все упражнения, которые включали бы список категорий, к которым они принадлежат. Поскольку это отношение "многие ко многим", в одном упражнении может быть много категорий. Я попробовал следующий код:
_context.Exercises
.Include(e => e.ExerciseCategories)
.OrderBy(e => e.Name).ToList();
Но он не заполняет свойства ExerciseCategory...
Как мне построить свой запрос, чтобы заполнить свойство Category в ExerciseCategory? Предпочтительнее в одном запросе, а не в цикле "for", потому что потенциально на одной странице будет отображаться много упражнений, и производительность может быть проблемой.
1 ответ
Поддержка Entity Framework 7 "многие ко многим" еще не завершена. В настоящее время вы должны сопоставить отношения один ко многим вручную для вашего Exercise
а также Category
юридические лица. Ваши классы сущностей настроены правильно. Теперь вам нужно переопределить OnModelCreating
метод в вашем классе DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ExerciseCategory>()
.HasKey(t => new { t.ExerciseId, t.CategoryId });
modelBuilder.Entity<ExerciseCategory>()
.HasOne(pt => pt.Exercise)
.WithMany(p => p.ExerciseCategories)
.HasForeignKey(pt => pt.ExerciseId);
modelBuilder.Entity<ExerciseCategory>()
.HasOne(pt => pt.Category)
.WithMany(t => t.ExerciseCategories)
.HasForeignKey(pt => pt.CategoryId);
}
См. Отношения - Entity Framework 7.0 Документация
Также не забудьте включить DbSet<ExerciseCategory>
собственность в вашем контексте.
После этого полный нетерпеливый запрос может быть построен следующим образом:
_context.ExerciseCategories.Include(ec => ec.Exercise)
.Include(ec => ec.Category)
.Select(ec => ec.Exercise)
Или с помощью ThenInclude для Exercise-запроса:
_context.Exercises.Include(e => e.ExerciseCategories)
.ThenInclude(ec => ec.Category)