AutoMapper嵌套实体映射失效,调用时触发栈溢出异常
解决AutoMapper映射时的栈溢出问题
你遇到的栈溢出问题几乎可以肯定是循环引用引发的无限递归映射。结合常见的EF实体设计逻辑,我推测VMTemplateGroup类里应该存在一个回引VMTemplates的导航属性(比如public virtual VMTemplates ParentTemplate { get; set; }这类)。当你用ReverseMap()自动生成双向映射时,AutoMapper会不断在VMTemplates→VMTemplateGroup→VMTemplates之间循环递归映射,最终耗尽栈空间触发溢出。
下面给你几个可行的解决办法:
1. 手动显式配置映射,忽略反向导航属性
放弃依赖ReverseMap()自动生成映射规则,改为手动定义每个方向的映射逻辑,明确忽略会导致循环的属性:
// 实体 → ViewModel:忽略ViewModel特有的上传属性,正常处理集合映射 confi.CreateMap<VMTemplates, VMTemplateViewModel>() .ForMember(dest => dest.TemplateUpload, opt => opt.Ignore()); // ViewModel → 实体:直接映射现有匹配属性即可 confi.CreateMap<VMTemplateViewModel, VMTemplates>(); // 处理VMTemplateGroup的双向映射,重点忽略回引的实体属性 confi.CreateMap<VMTemplateGroup, VMTemplateGroupViewModel>() .ForMember(dest => dest.VMTemplate, opt => opt.Ignore()); // 忽略ViewModel中可能存在的回引属性 confi.CreateMap<VMTemplateGroupViewModel, VMTemplateGroup>() .ForMember(dest => dest.VMTemplates, opt => opt.Ignore()); // 忽略实体中指向VMTemplates的回引属性
2. 用MaxDepth限制映射深度
如果不想逐个配置忽略属性,可以给映射规则加上MaxDepth,直接限制AutoMapper递归映射的层数,从根源上避免无限循环:
// 给双向映射添加深度限制,只映射一层嵌套层级 confi.CreateMap<VMTemplateViewModel, VMTemplates>() .ReverseMap() .MaxDepth(1); confi.CreateMap<VMTemplateGroupViewModel, VMTemplateGroup>() .ReverseMap() .MaxDepth(1);
额外注意点
- 务必确认
VMTemplateGroup类是否真的存在回引VMTemplates的属性,这是循环递归的核心触发点。 - ViewModel里的
TemplateUpload属性在映射到实体时必须忽略,因为实体类没有对应字段,虽然它不会直接导致栈溢出,但也是潜在的映射错误。
内容的提问来源于stack exchange,提问作者user1037747
相关产品推荐
相关产品推荐

