具有不同 children 的 AutoMapper

AutoMapper with different children

我有一个实体 Plan 有多个 sub-plans (children),每个都可以是 null.

对于 PlanDto,我正在尝试加载所有 children 的列表,而不是像实体一样为每个 child 加载一个单独的 属性。

我已经通过 foreach 循环手动实现了它,但现在我正在尝试通过 AutoMapper 实现它,但由于某种原因失败了。

实体:

public class Plan
{
    public virtual int Id { get; set; }
    public DateTime Date { get; set; }
    public virtual PlanDetail PlanChild1 { get; set; }
    public virtual ObservationCare PlanChild2 { get; set; }
}

public class PlanDetail
{
    public virtual int Id { get; set; }
    public virtual Plan Plan { get; set; }
    public virtual string Description { get; set; }
}

public class ObservationCare
{
    public virtual int Id { get; set; }
    public virtual Plan Plan { get; set; }
    public virtual string Description { get; set; }
}

DTO:

public class PlanDto: EntityDto
{
    public DateTime Date { get; set; }
    public IEnumerable<ChildPlan> ChildPlan { get; set; }
}

public class ChildPlan : EntityDto
{
    public ChildPlanType Type { get; set; }
}

public enum ChildPlanType
{
    PlanDetail,
    ObservationCare
}

AutoMapper 配置:

configuration.CreateMap<Plan, PlanDto>();

configuration.CreateMap<PlanDetail, ChildPlan>()
    .ForMember(dto => dto.Type, options => options.MapFrom(p => ChildPlanType.PlanDetail));

configuration.CreateMap<ObservationCare, ChildPlan>()
    .ForMember(dto => dto.Type, options => options.MapFrom(p => ChildPlanType.ObservationCare));

映射尝试:

var output = new List<PlanDto>();
var plans = await _planRepository.GetAll().ToList();
foreach (var plan in plans)
{
    output.Add(ObjectMapper.Map<PlanDto>(plan));
}

我不知道为什么 output 列表中的 ChildPlan DTO 总是 null!

您必须为 PlanDto.ChildPlan 指定映射:

configuration.CreateMap<Plan, PlanDto>()
    .ForMember(dto => dto.ChildPlan,
        options => options.MapFrom(
            p => new object[] { p.PlanChild1, p.PlanChild2 }.Where(c => c != null)));

如果您正在使用 Entity Framework Core,则必须使用预先加载:

var plans = await _planRepository.GetAll()
    .Include(p => p.PlanChild1)
    .Include(p => p.PlanChild2)
    .ToList();

还有一种更简单、更有效的映射列表的方法:

var output = ObjectMapper.Map<List<PlanDto>>(plans);