使用 Entity Framework 7 获取多对多对象

Whe*_*der 0 c# entity-framework entity-framework-core

我在此处通过数据库图说明了以下多对多关系设置: 在此处输入图片说明

这些由以下 POCO 类表示,首先使用实体​​框架代码从中创建数据库:

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我需要获得所有练习,其中包括它们所属的类别列表。由于它是多对多关系,因此一个练习可以有多个类别。我尝试了以下代码:

_context.Exercises
            .Include(e => e.ExerciseCategories)
            .OrderBy(e => e.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

但它不会填充锻炼类别的属性......

我应该如何构造我的查询来填充锻炼类别的类别属性?最好在一个查询中而不是在“for”循环中,因为可能在一页上显示许多练习并且性能可能是一个问题。

V.L*_*eon 5

Entity Framework 7 多对多支持仍然不完整。目前,您必须为您的实体ExerciseCategory实体手动映射一对多关系。您的实体类设置正确。您现在需要覆盖OnModelCreatingDbContext 类中的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

请参阅关系 - 实体框架 7.0 文档

还要确保DbSet<ExerciseCategory>在您的上下文中包含属性。

在此之后,可以通过以下方式构建完整的急切查询:

_context.ExerciseCategories.Include(ec => ec.Exercise)
                    .Include(ec => ec.Category)
                    .Select(ec => ec.Exercise)
Run Code Online (Sandbox Code Playgroud)

或者通过在练习查询上使用 ThenInclude :

_context.Exercises.Include(e => e.ExerciseCategories)
                  .ThenInclude(ec => ec.Category)
Run Code Online (Sandbox Code Playgroud)