我正在使用.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; }
}
我为Rest Api调用/ api / Phases创建了以下DTO
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))
对?
由于您PhaseCategoryId
的Phase
模型中没有调用任何属性,因此您将强迫自己加载该PhaseCategory
属性,以使映射发生,并且-
Include(pc => pc.PhaseCategory)
查询的一部分导致内部联接。
添加外键属性-
public int PhaseCategoryId { get; set; }
在Phase
模型中,并简单地定义映射配置-
CreateMap<Phase, PhaseReadDTO>();
然后,您可以查询不包含Include
零件的零件,并且仍然PhaseCategoryId
在响应中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句