AutoMapper双向映射能否单行实现?忽略Settings字段遇报错
解决AutoMapper双向映射单行实现的问题
嘿,我明白你想把两行的双向映射简化成单行的需求,咱们来搞清楚问题出在哪,以及怎么解决:
首先,你原来的配置是完全没问题的:
CreateMap<LayoutRequest, Layout>(); CreateMap<Layout, LayoutRequest>().ForMember(m => m.Settings, opt => opt.Ignore());
这段代码分别创建了**正向(LayoutRequest→Layout)和反向(Layout→LayoutRequest)**的映射,并且在反向映射里忽略了Settings字段。
你尝试的CreateMap<LayoutRequest, Layout>().ForSourceMember(m => m.Settings, opt => opt.Ignore())之所以无效,是因为ForSourceMember是用来配置正向映射中「源对象」的成员的——也就是说,你这行代码是在告诉AutoMapper:“把LayoutRequest转成Layout的时候,忽略源对象(LayoutRequest)里的Settings字段”,但这根本不是你要的效果,你要的是反向映射时忽略目标对象(LayoutRequest)的Settings,所以才会出现“没有Settings的映射”的错误提示。
正确的单行实现方式
要把双向映射合并成一行,得用AutoMapper的ReverseMap()方法,它会基于正向映射自动生成反向映射,然后你可以链式配置反向映射的规则:
CreateMap<LayoutRequest, Layout>() .ReverseMap() .ForMember(dest => dest.Settings, opt => opt.Ignore());
这段代码的作用和你原来的两行完全等价:
- 先创建
LayoutRequest→Layout的正向映射(无额外配置,按默认规则映射) ReverseMap()生成Layout→LayoutRequest的反向映射- 最后通过
ForMember指定在反向映射中,忽略目标对象(LayoutRequest)的Settings字段
这样就完美实现了你想要的单行双向映射配置,而且功能和原来的两行代码完全一致~
内容的提问来源于stack exchange,提问作者Serg046
相关产品推荐
相关产品推荐

