这些由以下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; }
}
现在我需要获得所有练习,其中包括他们所属的类别列表。由于它是多对多关系,因此一个练习可以有许多类别。 我尝试了以下代码:
_context.Exercises
.Include(e => e.ExerciseCategories)
.OrderBy(e => e.Name).ToList();
但它没有填充ExerciseCategory的属性......
我应该如何构建查询以填充ExerciseCategory的Category属性?优先考虑一个查询,而不是在&#34; for&#34;循环,因为可能会在一个页面上显示许多练习,并且性能可能是个问题。
答案 0 :(得分:4)
实体框架7多对多支持仍未完成。目前,您必须手动为Exercise
和Category
实体映射一对多关系。您的实体类已正确设置。您现在需要在DbContext类中重写OnModelCreating
方法:
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);
}
请参阅Relationships - Entity Framework 7.0 Documentation
还要确保在您的上下文中包含DbSet<ExerciseCategory>
属性。
在此之后,可以通过以下方式构建完整的急切查询:
_context.ExerciseCategories.Include(ec => ec.Exercise)
.Include(ec => ec.Category)
.Select(ec => ec.Exercise)
或者在运动查询中使用ThenInclude:
_context.Exercises.Include(e => e.ExerciseCategories)
.ThenInclude(ec => ec.Category)