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”循环中,因为可能在一页上显示许多练习并且性能可能是一个问题。
Entity Framework 7 多对多支持仍然不完整。目前,您必须为您的实体Exercise和Category实体手动映射一对多关系。您的实体类设置正确。您现在需要覆盖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)
还要确保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)
| 归档时间: |
|
| 查看次数: |
1214 次 |
| 最近记录: |