我有一个System.StackOverflowException
当尝试在 AutoMapper 5 中映射以前在 AutoMapper 4 中工作的内容时。
经过一番谷歌搜索后,我发现这是由循环引用.
AutoMapper 文档说:
以前,AutoMapper 可以通过保留来处理循环引用
跟踪映射的内容,并在每次映射时检查本地
源/目标对象的哈希表,以查看该项目是否已经存在
映射。事实证明这种跟踪非常昂贵,你需要
选择使用 PreserveReferences 使圆形地图正常工作。
或者,您可以配置 MaxDepth:
// Self-referential mapping
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);
// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();
所以我添加了.MaxDepth(3)
我的代码现在又可以工作了。
但是我不明白真正的问题是什么以及我通过添加该行做了什么:)
我的问题:
- 对于 Category/CategoryDto 而言,“循环引用”是什么意思?
- 到底是做什么的
.MaxDepth()
?为什么示例中使用 3?
- What is
.PreserveReferences()
for?
PreserveReferences
将使地图表现得像AutoMapper4
正如你习惯的那样。它将使AutoMapper
跟踪映射的内容并防止其导致溢出。
另一个选项是设置您想要的深度AutoMapper
来穿越。通过设定的深度,它将按照指定的次数映射自引用模型。
循环引用将是一个类,例如:
public class Category
{
public int Id {get;set;}
public Category Child {get;set;}
public string Value {get;set;}
}
引用自身的类、属性Child
意味着你可以多次嵌套这个对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)