【问题标题】:AutoMapper with different childrenAutoMapper 与不同的孩子
【发布时间】:2018-04-13 01:38:57
【问题描述】:

我有一个实体 Plan,有多个子计划(子计划),每个子计划都可以是 null

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

我已经通过 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

【问题讨论】:

    标签: c# automapper children dto


    【解决方案1】:

    你必须为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,你必须使用 eager-loading:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2021-09-28
      • 2019-04-15
      • 2017-01-25
      • 2019-08-20
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多