如果对象为空,如何配置 Automapper 9 以忽略对象属性,但如果不为空,则如何映射

How to configure Automapper 9 to ignore Object-Properties if object is null but map if not null

我已经尝试了很多,但找不到我真正想要的东西。这是我的情况:我有一个带有导航属性和 viewModel 的 EF-Core 实体:

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-属性(条件似乎不适用于此处):

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

如果设置了 NestedObject 属性,第二个 CreateMap 不会映射它们,如果未设置属性,则首先创建一个新的 NestedObject。但是两者都不起作用。有什么解决办法吗?

删除 ReverseMap() ,然后尝试使用 AutoMapper Conditional Mapping 并使用 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;
                     }

                 });