c# - 如何在 Automapper 中从源代码制作部分 map

标签 c# automapper

我试图仅将对象的 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));

针对此特定映射器配置运行单元测试会因缺少映射而出现 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/

相关文章:

c# - .NET 软件更新管理器

C# 卸载程序正在删除我在安装时创建的注册表项

.net - AutoMapper中的Mapper.Map线程安全吗?

c# - Automapper 使用简单注入(inject)器 (Ioc) 将依赖项注入(inject)自定义类型转换器

c# - Automapper - 如何映射私有(private)支持字段

c# - 您认为哪些 Visual Studio 插件对于新的(ish)/返回的 C# 开发人员必不可少?

c# - JsonSerializer 无法写入 GZipStream

asp.net-mvc-3 - 使用 AutoMapper 将元数据传输到 View 模型的技术

c# - 使用 AutoMapper 进行映射后,如何不丢失目标对象中存在但源对象中不存在的属性

C# Xamarin IOS : Equivalent of SystemClock. C# IOS Xamarin 中的 ElapsedRealtime()