Automapper - необходимо сопоставить родительское свойство при отображении детей - PullRequest
0 голосов
/ 28 декабря 2018

Основная проблема заключается в том, что у меня есть свойства в исходных родительских сущностях, которые мне нужно сопоставить с моими дочерними DTO назначения, когда дочерние сущности сопоставляются с дочерними DTO назначения.Дочерние объекты не имеют свойств навигации к своим родителям.Как вы можете видеть ниже, у родителя есть поле дочернего типа.В приведенном ниже коде вы можете видеть, что ParentSource имеет свойство с именем TitleImage типа ImageSource.Таким образом, связь является одним направленным.В моем коде я использую ImageSource везде.Существует как минимум 15 различных объектов со свойствами типа ImageSource.Я нормализовал свою базу данных.Сущность ImageSource не имеет координат X и Y, потому что только несколько, может быть, 5 из 30 мест действительно нуждаются в этих дополнительных значениях.В тех немногих местах я добавил X и Y на родительском элементе, как вы видите на классе ParentSource с помощью 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 голосов
/ 04 января 2019

Или вы можете сделать это в конфигурации (не проверенной или протестированной), которую вы можете предпочесть, но в 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
            }
        ));
0 голосов
/ 04 января 2019

Из того, что я понял, вы хотите, чтобы X & Y от родителя перешло к ребенку.Для этого вы можете использовать класс конвертера.

Конвертер:

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;
    }
}

Отображение:

CreateMap<ParentSource, ParentDest>()
    .ConvertUsing<ParentConverter>();

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