Как сделать частичную карту из источника в Automapper - PullRequest
2 голосов
/ 27 января 2020

Я пытаюсь сопоставить только 2 из 4 свойств объекта с типом назначения. В моем случае DeletedBy и DeletedDate, где в качестве значения DeletedDate будет просто установлена ​​текущая дата UT C.

public class DeleteCommand : IRequest
{
    public string CodePath { get; set; }

    [JsonIgnore]
    public Guid? DeletedBy { get; set; }

    [IgnoreMap]
    public DeleteMode DeleteMode { get; set; } = DeleteMode.Soft;
}

Это моя текущая конфигурация:

CreateMap<DeleteCommand, Asset>(MemberList.Source)
    .ForMember(x => x.DeletedDate, opt => opt.MapFrom(src => DateTime.UtcNow))
    .ForMember(x => x.DeletedBy, opt => opt.MapFrom(src => src.DeletedBy));

Выполнение модульного теста с указанным c конфигурацией сопоставления дает мне 2 ошибки для отсутствующего сопоставления:

[Fact]
public void MapperConfigShouldBeValid()
{
    _config.AssertConfigurationIsValid();
}

Несопоставленные свойства: DeletedDate DeleteMode

Это сбивает меня с толку, так как Date определен явно, а DeleteMode настроен на игнорирование по умолчанию. Если возможно, я хочу избежать создания другого dto, которое будет отображаться из первого dto, а затем в сущность, для мягкого удаления, путем установки полей аудита.

Вещи, которые я пробовал до сих пор:

  • IgnoreMapAttribute, как показано выше
  • ForSourceMember(), похоже, не поддерживает метод Ignore для свойства источника.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Эту проблему можно решить, удалив MemberList.Source из списка аргументов CreateMap() и проигнорировав все оставшиеся неотображенные целевые элементы.

CreateMap<DeleteCommand, Asset>()
.ForMember(x => x.DeletedDate, opt => opt.MapFrom(src => DateTime.UtcNow))
.ForMember(x => x.DeletedBy, opt => opt.MapFrom(src => src.DeletedBy))
.ForAllOtherMembers(x => x.Ignore())

То же самое можно было бы получить с помощью CreateMap(MemberList.None). Это даже не требует явного игнорирования всех остальных членов назначения.

1 голос
/ 27 января 2020

Удаление DeletedDate как свойства решило 50% моих проблем, так как оно мне больше не нужно в источнике.

Другой обновлял карту с ForSourceMember(x => x.DeleteMode, y => x.DoNotValidate())

Это также работает в быстром модульном тесте:

[Fact]
public void DeleteMapShouldSetAuditFields()
{
    var asset = new Asset();
    var cmd = new DeleteCommand
    {
        DeletedBy = Guid.NewGuid()
    };

    _mapper.Map(cmd, asset);

    Assert.NotNull(asset.DeletedBy);
    Assert.NotNull(asset.DeletedDate);
    Assert.Equal(cmd.DeletedBy, asset.DeletedBy);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...