首页 > 解决方案 > 如果对象为空,如何将 Automapper 9 配置为忽略对象属性,但如果不为空则映射

问题描述

我已经尝试了很多,但我找不到我真正想要的东西。这是我的情况:我有一个带有导航属性和 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-Property,它也会创建一个新的 NestedObject(条件似乎在这里不适用):

CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
        .ForPath(m => m.NestedObject.StringValue, opt =>
        {
            opt.Condition(s => s.Destination.NestedObject != null); 
            opt.MapFrom(m => m.NestedObjectStringValue);
        });

如果 Properties 为 null,这可以避免创建新的 NestedObject,但如果不是,则不会映射 NestedObject 属性:

CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source)
    .ForMember(m => m.NestedObject, opt => opt.AllowNull());

如果设置了第二个 CreateMap,则不会映射 NestedObject-Properties,如果未设置 Properties,则首先创建一个新的 NestedObject。但是两者一起都不起作用。任何想法如何解决这个问题?

标签: asp.net-core.net-coreentity-framework-coreautomapper

解决方案


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

                 });

推荐阅读