AutoMapper映射子对象属性时抛出ArgumentException异常的解决方法咨询
解决AutoMapper嵌套属性映射的ArgumentException问题
首先,咱们来拆解你遇到的问题,核心有两个错误导致了这个异常:
1. 映射方向完全搞反了
你的代码逻辑是要把Owner对象转换成IEnumerable<Car>,但你在CarProfile里创建的是Car → Owner的映射,这和实际需求的方向完全相反。AutoMapper找不到匹配的映射配置,再加上后续嵌套属性的配置错误,自然就抛出了异常。
2. 错误使用ForMember处理嵌套属性
AutoMapper的ForMember方法要求目标表达式必须是顶级成员,而你写的m => m.OwnerData.Name是嵌套在OwnerData下的子属性,这不符合ForMember的使用规则,必须用ForPath来指定嵌套属性的完整路径。
正确的配置方案
根据你的需求(将Owner的属性映射到Car.OwnerData对应的属性),这里提供两种可行的配置方式:
方案一:直接使用ForPath配置嵌套属性
public class CarProfile : Profile { public CarProfile() { // 建立正确的映射方向:Owner → Car CreateMap<Owner, Car>() // 用ForPath指定嵌套属性的映射路径 .ForPath(dest => dest.OwnerData.Id, opt => opt.MapFrom(src => src.Id)) .ForPath(dest => dest.OwnerData.Name, opt => opt.MapFrom(src => src.Name)) .ForPath(dest => dest.OwnerData.Phone, opt => opt.MapFrom(src => src.Phone)) // 根据业务需求处理Car的其他属性: // 如果不需要映射Car.Id,可以忽略;如果需要赋值,自行调整规则 .ForMember(dest => dest.Id, opt => opt.Ignore()) // 同理处理Car.Name,这里暂时忽略,你可以根据实际需求设置 .ForMember(dest => dest.Name, opt => opt.Ignore()); } }
方案二:先配置子对象映射,再关联到父对象
如果Owner和OwnerData的结构基本一致,你可以先单独配置它们之间的映射,再让AutoMapper自动处理嵌套关系:
public class CarProfile : Profile { public CarProfile() { // 先配置Owner → OwnerData的映射(结构一致的话,AutoMapper会自动匹配同名属性) CreateMap<Owner, OwnerData>(); // 再配置Owner → Car的映射,直接将Owner对象映射到Car的OwnerData属性 CreateMap<Owner, Car>() .ForMember(dest => dest.OwnerData, opt => opt.MapFrom(src => src)) // 同样处理Car的其他属性 .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Name, opt => opt.Ignore()); } }
关于集合映射的说明
你代码里的mapper.Map<IEnumerable<Car>>(ownerData)是可以正常工作的——只要你配置了单个Owner → Car的映射,AutoMapper会自动处理单个对象到集合的转换,最终得到一个包含单个Car对象的集合。
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

