自动映射器-映射子级时需要映射父级属性

时间:2018-12-28 17:34:22

标签: automapper automapping automapper-6

基本问题是,当子实体映射到目标子DTO时,我需要在源父实体上映射到目标子DTO。子实体没有到其父实体的导航属性。如下所示,父级具有子类型的字段。您可以在下面的代码中看到ParentSource具有名为ImageImage类型的TitleImage属性。因此,链接是一个方向。在我的代码中,我到处都使用ImageSource。至少有15个不同的实体,其属性类型为ImageSource。我规范化了我的数据库。 ImageSource实体没有X和Y坐标,因为实际上只有少数几个位置(可能是30个位置中的5个)需要这些额外的值。在那几个地方,如您在ParentSource类上看到的那样,将Title上的X和Y添加到TitleImageX和TitleImageY。

我可以轻松地通过循环来完成我想做的事情,这就是我现在正在做的事情,但是如果可以的话,我很乐意使用Automapper。这样会减少代码。

这是我的课程:

public class ParentSource
{
    public string Id { get; set; }
    public string Name { get; set; }
    public ImageSource HomeImage { get; set; }
    public ImageSource TitleImage { get; set; }
    //These should be copied to the child object
    public int TitleImageX { get; set; }
    public int TitleImageY { get; set; }
}
public class ParentDest
{
    public string ParentId { get; set; }
    public string DisplayName { get; set; }
    public ImageDest HomeImage { get; set; }
    public ImageDest TitleImage { get; set; }
}
public class ImageSource
{
    public string Id { get; set; }
    public string Url { get; set; }
    public decimal Height { get; set; }
    public decimal Width { get; set; }
}
public class ImageDest
{
    public string ImageId { get; set; }
    public string ImageUrl { get; set; }
    public decimal Height { get; set; }
    public decimal Width { get; set; }
    //Not all images have Coordinate
    public decimal XCoordinate { get; set; }
    public decimal YCoordinate { get; set; }
}

到目前为止,这是我要做的映射。我不知道如何将X和Y坐标从父级复制到子级。

        CreateMap<ParentSource, ParentDest>()
            .ForMember(
                dest => dest.ParentId,
                opt => opt.MapFrom(src => src.Id))
            .ForMember(
                dest => dest.DisplayName,
                opt => opt.MapFrom(src => src.Name));

        CreateMap<ImageSource, ImageDest>()
            .ForMember(
                dest => dest.ImageId,
                opt => opt.MapFrom(src => src.Id))
            .ForMember(
                dest => dest.ImageUrl,
                opt => opt.MapFrom(src => src.Url));

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

或者您可以按照自己喜欢的配置(未经尝试或测试)进行操作,但是TitleImage上不会检查是否为空

CreateMap<ParentSource, ParentDest>()
    .ForMember(
        dest => dest.ParentId,
        opt => opt.MapFrom(src => src.Id))
    .ForMember(
        dest => dest.DisplayName,
        opt => opt.MapFrom(src => src.Name))
    .ForMember(dest=>dest.TitleImage, 
        opt=>opt.MapFrom(src=>new ImageDest
            {
                Width = src.TitleImage.Width,
                Height = src.TitleImage.Height,
                ImageId = src.TitleImage.Id,
                ImageUrl = src.TitleImage.Url,
                XCoordinate = src.TitleImageX,
                YCoordinate = src.TitleImageY
            }
        ));

答案 1 :(得分:-1)

根据我的收集,您希望X&Y从父级到子级。您可以为此使用转换器类。

转换器:

nameObservable
  .pipe(
    map(person => {                               
      return giveMeSomeObervable.yourName(person).subscribe(data => data);
    })
  )
  .subscribe(data => console.log(data));

映射:

public class ParentConverter : ITypeConverter<ParentSource, ParentDest>
{
    public ParentDest Convert(ParentSource source, ParentDest destination, ResolutionContext context)
    {
        if (destination == null)
            destination = new ParentDest();

        destination.DisplayName = source.Name;
        destination.ParentId = source.Id;

        if (source.TitleImage != null)
        {
            destination.TitleImage = context.Mapper.Map<ImageDest>(source.TitleImage);
            destination.TitleImage.XCoordinate = source.TitleImageX;
            destination.TitleImage.YCoordinate = source.TitleImageY;
        }

        return destination;
    }
}