Получение объектов "многие ко многим" с помощью 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)
Другие вопросы по тегам