如何在Automapper中从源代码进行局部映射

问题描述 投票:1回答:2

我正在尝试将4个属性中的2个仅从一个对象映射到目标类型。在我的情况下DeletedByDeletedDate,其中DeletedDate会简单地设置为当前UTC日期。

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

针对此特定的映射器配置运行单元测试会给我两个缺少映射的错误:

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

未映射的属性:删除日期DeleteMode

,这使我感到困惑,因为默认情况下明确定义了Date并将DeleteMode设置为忽略。如果可能的话,我想避免通过设置审计字段来创建另一个dto,以将其从第一个dto映射到随后要软删除的实体。

到目前为止我尝试过的事情:

  • IgnoreMapAttribute如上所示
  • ForSourceMember(),似乎不支持对源属性使用忽略方法。
c# automapper
2个回答
1
投票

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

0
投票

这可以通过从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)可以达到相同的目的。这甚至不需要明确地忽略所有其他目标成员。

© www.soinside.com 2019 - 2024. All rights reserved.