Entity Framework 核心,return 只是将 id 与 Automapper 相关联?

Entity Framework Core, return just related id with Automapper?

我正在使用 .netCore 3.1、EF Core 和 Automapper 开发 REST Api。

我有以下实体:

public class Phase
{
    public int Id { get; set; }

    [Required]
    [MaxLength(50)]
    public String Name { get; set; }

    [MaxLength(800)]
    public String Description { get; set; }

    [Required]
    public PhaseCategory PhaseCategory { get; set; }
}

public class PhaseCategory
{
  public int Id { get; set; }

  [MaxLength(50)]
  public String Name { get; set; }
}

我为其余部分创建了以下 DTO Api 调用 /api/Phases

public class PhaseReadDTO
{
    public int Id { get; set; }

    public String Name { get; set; }

    public String Description { get; set; }

    public int PhaseCategoryId { get; set; }
}

我遇到的问题是为了使PhaseCategoryId可用,我需要通过以下方式查询:

var phase = _dbContext.Phases.Include(pc => pc.PhaseCategory).ToList();
return Ok(_mapper.Map<IEnumerable<PhaseReadDTO>>(phase));

这意味着在幕后,EF 正在执行不需要的 INNER JOIN

SELECT [p].[Id], [p].[Description], [p].[Name], [p].[PhaseCategoryId], [p0].[Id], [p0].[Name]  
    FROM [Phases] AS [p]  
    INNER JOIN [PhaseCategories] AS [p0] ON [p].[PhaseCategoryId] = [p0].[Id]

但是当我这样做的时候

var phase = _dbContext.Phases.ToList();
return Ok(_mapper.Map<IEnumerable<PhaseReadDTO>>(phase));

查询是我所期望的

SELECT [p].[Id], [p].[Description], [p].[Name], [p].[PhaseCategoryId]  
            FROM [Phases] AS [p]

PhaseCategoryId 未填充在响应中。

我想您的映射配置中有类似以下行的内容 -

.ForMember(d => d.PhaseCategoryId, opt => MapFrom(s => s.PhaseCategory.Id))

对吗?

由于您的 Phase 模型中没有名为 PhaseCategoryId 的 属性,因此您强迫自己加载 PhaseCategory 属性使映射发生,并且 -

Include(pc => pc.PhaseCategory)

您的部分查询导致了内部联接。

添加外键属性-

public int PhaseCategoryId { get; set; }

在您的 Phase 模型中并将映射配置简单地定义为 -

CreateMap<Phase, PhaseReadDTO>();

然后您可以在没有 Include 部分的情况下进行查询,并且在响应中仍然有 PhaseCategoryId