我试图仅将对象的 4 个属性中的 2 个映射到目标类型。在我的例子中,DeletedBy
和 DeletedDate
,其中 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));
针对此特定映射器配置运行单元测试会因缺少映射而出现 2 个错误:
[Fact]
public void MapperConfigShouldBeValid()
{
_config.AssertConfigurationIsValid();
}
Unmapped properties: DeletedDate DeleteMode
这让我很困惑,因为 Date 是显式定义的,而 DeleteMode 默认设置为被忽略。如果可能的话,我想避免创建另一个 dto 从第一个 dto 映射,然后映射到实体,通过设置审核字段进行软删除。
到目前为止我尝试过的事情:
IgnoreMapAttribute
如上所示ForSourceMember()
似乎不支持源属性的 Ignore 方法。
最佳答案
这可以通过从 CreateMap()
的参数列表中删除 MemberList.Source
并忽略所有剩余的未映射目标成员来解决。
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)
也可以实现同样的效果。这甚至不需要明确忽略所有其他目标成员。
关于c# - 如何在 Automapper 中从源代码制作部分 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59928393/