Как настроить Automapper 9 на игнорирование свойств объекта, если объект равен нулю, но отображается, если нет нуля - PullRequest
0 голосов
/ 12 октября 2019

Я много пробовал, но не могу найти то, что действительно ищу. Это мой случай: у меня есть сущность EF-Core с навигационными свойствами и viewModel:

public class SomeEntity
{
    public Guid Id { get; set; }
    public virtual NestedObject NestedObject { get; set; }
    public DateTime Created { get; set; }
    public DateTime Modified { get; set; }
}

public class SomeEntityViewModel
{
    public Guid Id { get; set; }
    public string NestedObjectStringValue { get; set; }
    public int NestedValueIntValue { get; set; }
}

Это мой CreateMap, который создает новый NestedObject, даже если NestedObject-Property не установлен (Условие некажется, что это применимо и здесь):

CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
        .ForPath(m => m.NestedObject.StringValue, opt =>
        {
            opt.Condition(s => s.Destination.NestedObject != null); 
            opt.MapFrom(m => m.NestedObjectStringValue);
        });

Это позволяет избежать создания нового NestedObject, если свойства имеют нулевое значение, но если нет, свойства NestedObject не отображаются:

CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
    .ForMember(m => m.NestedObject, opt => opt.AllowNull());

Второй CreateMap не выполняет• Сопоставьте NestedObject-Properties, если они установлены, сначала создайте новый NestedObject, если Properties не установлены. Но оба вместе не работают. Есть идеи как это решить?

1 Ответ

2 голосов
/ 14 октября 2019

Удалите ReverseMap(), затем попробуйте использовать AutoMapper Условное сопоставление и используйте ForPath вместо ForMember для свойств вложенного дочернего объекта:

CreateMap<SomeEntityViewModel, SomeEntity>()
    .ForPath(
            m => m.NestedObject.StringValue, 
            opt => {                         
                     opt.Condition(
                        s => s.DestinationMember != null && s.DestinationMember != "" 
                     );
                     opt.MapFrom(s => s.NestedObjectStringValue);
                   }
            );

То же самое для IntValue.

Обновление

Итак, если NestedObject равно нулю, вы не хотите отображать значение с SomeEntityViewModel на него. Если NestedObject не равно нулю, отображение работает.

Пожалуйста, обратитесь к приведенному ниже коду, который использует AfterMap

CreateMap<SomeEntityViewModel, SomeEntity>()
             .ForMember(q => q.NestedObject, option => option.Ignore())
             .AfterMap((src, dst) => {
                     if(dst.NestedObject != null)
                     {
                     dst.NestedObject.StringValue = src.NestedObjectStringValue;
                     }

                 });
...