如果对象为空,如何将 Automapper 9 配置为忽略对象属性,但如果不为空则映射 电脑版发表于:2022/11/5 12:12 ### 问题描述 我尝试了很多,但找不到我真正要找的东西.这是我的情况:我有一个带有导航属性和视图模型的 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); }); ``` 如果属性为空,则避免创建新的 NestedObject,但如果不是,则不会映射 NestedObject 属性: ``` CreateMap<SomeEntityViewModel, SomeEntity>(MemberList.Source) .ForMember(m => m.NestedObject, opt => opt.AllowNull()); ``` 如果设置了第二个 CreateMap,则不会映射 NestedObject-Properties,如果未设置 Properties,则首先创建一个新的 NestedObject.但两者都不起作用.任何想法如何解决这个问题? ### 推荐答案 移除 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; } }); ``` 原文:https://www.it1352.com/2598455.html