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
。
我正在使用 .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
。