如何解决AutoMapper映射POCO到Record时嵌套属性映射失败问题
问题原因
这是AutoMapper的默认映射规则导致的使用问题,不是BUG。
AutoMapper 10.1.1 版本映射到 positional record(位置参数定义的record)时,构造函数参数映射的优先级高于属性映射配置。你在Profile中定义的ForMember规则仅针对属性赋值生效,不会作用到构造参数的匹配逻辑。
你定义的ExistingBook是只有一个CreatedBy参数的位置record,AutoMapper映射时会优先匹配源类型Book中同名的CreatedBy属性(Person类型),直接将该对象传入构造函数,相当于隐式调用了ToString(),所以你得到的是Tests.UnitTests.Person这个类型名称字符串,而不是你想要的Name属性值。
解决方案
- 方案1:为构造参数单独配置映射规则
将你的AutoMapper配置修改为指定构造参数的映射逻辑:
public AutoMapperProfile() { CreateMap<Book, ExistingBook>() .ForCtorParam("CreatedBy", opt => opt.MapFrom(z => z.CreatedBy.Name)); }
- 方案2:修改record定义为显式属性模式
如果不需要强制用位置参数构造record,可以把record改成带初始化属性的写法,此时原有的ForMember属性映射规则会正常生效:
public record ExistingBook { public string CreatedBy { get; init; } }
内容的提问来源于stack exchange,提问作者mu88
相关产品推荐
相关产品推荐

