使用Automapper进行深层映射
本文关键字:映射 Automapper 使用 | 更新日期: 2023-09-27 18:05:15
我正在尝试映射具有多级成员的对象:这些是类:
public class Father
{
public int Id { get; set; }
public Son Son { get; set; }
}
public class FatherModel
{
public int Id { get; set; }
public int SonId { get; set; }
}
public class Son
{
public int Id { get; set; }
}
这就是我尝试自动映射的方式:
AutoMapper.Mapper.CreateMap<FatherModel , Father>()
.ForMember(dest => dest.Son.Id, opt => opt.MapFrom(src => src.SonId));
这是我得到的例外:
表达式"dest=>Convert(dest.Son.Id("必须解析为顶级成员,而不是任何子对象的属性。在上使用自定义冲突解决程序子类型或AfterMap选项。参数名称:lambdaExpression
感谢
这将适用于映射到新对象或现有对象。
Mapper.CreateMap<FatherModel, Father>()
.ForMember(x => x.Son, opt => opt.MapFrom(model => model));
Mapper.CreateMap<FatherModel, Son>()
.ForMember(x => x.Id, opt => opt.MapFrom(model => model.SonId));
AutoMapper.Mapper.CreateMap<FatherModel, Father>()
.ForMember(x => x.Son, opt => opt.ResolveUsing(model => new Son() {Id = model.SonId}));
如果它变得越来越复杂,您可以编写ValueResolver类,请参阅此处的示例-https://docs.automapper.org/en/stable/Custom-value-resolvers.html
使用ForPath而不是ForMember&它的作用就像魔术一样。
AutoMapper.Mapper.CreateMap<FatherModel ,Father>()
.ForMember(dest => dest.Son, opt => opt.MapFrom(src => new Son {Id = src.SonId}));
它工作正常