AutoMapper:如何忽略目标子集合属性中的缺失属性
解决AutoMapper子集合属性忽略缺失属性的问题
嘿,很高兴你已经搞定了单个对象之间的属性忽略!关于子集合的情况,其实逻辑和单个对象是一致的——你只需要给集合里的子类型也配置同样的忽略规则,AutoMapper会自动递归处理集合中的每一个元素。
具体操作可以分这几步来:
1. 确认你的基础忽略配置
首先确保你已经有了针对单个对象忽略目标缺失属性的配置,比如之前实现的单类型映射配置:
Mapper.Initialize(cfg => { // 单个CustomerViewModel到Customer的映射,忽略目标缺失属性 cfg.CreateMap<CustomerViewModel, Customer>() .ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null)); });
或者是更省心的全局配置(对所有映射生效):
Mapper.Initialize(cfg => { // 全局规则:所有映射都忽略目标对象中源对象没有的属性(或源属性为null的情况) cfg.ForAllMaps((map, exp) => { exp.ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null)); }); // 显式声明主类型映射 cfg.CreateMap<CustomerViewModel, Customer>(); });
2. 给子类型添加映射配置
接下来只需要给集合中的子类型(也就是ContactViewModel和Contact)也添加对应的映射配置就行:
- 如果是单类型配置,直接新增一条子类型的映射规则:
cfg.CreateMap<ContactViewModel, Contact>() .ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null));
- 如果是全局配置,只需要显式声明子类型的映射关系,全局规则会自动应用上去:
cfg.CreateMap<ContactViewModel, Contact>();
3. 为什么这样生效?
当AutoMapper处理CustomerViewModel.Contacts到Customer.Contacts的映射时,它会自动遍历集合里的每一个ContactViewModel实例,用你配置好的ContactViewModel→Contact规则去映射每个元素。这样一来,Contact类中那些ContactViewModel没有的属性,就会和主对象一样被忽略啦。
额外提醒:AutoMapper对ICollection这类集合类型有默认的处理逻辑,会自动创建目标集合并映射内部元素,你不需要额外配置集合本身的映射,只需要关注元素类型的映射规则就好。
内容的提问来源于stack exchange,提问作者Jose L. Garcia
相关产品推荐
相关产品推荐

