迁移到AutoMapper 5 -循环引用
本文关键字:循环 引用 AutoMapper 迁移 | 更新日期: 2023-09-27 18:18:25
当我试图在AutoMapper 5中映射以前与AutoMapper 4一起工作的东西时,我有一个System.StackOverflowException
。
在谷歌了一下之后,我发现这是由循环引用引起的。
AutoMapper文档说:
以前,AutoMapper可以通过保持跟踪映射的内容,在每个映射中,检查本地源/目标对象的哈希表,以查看项目是否已经存在映射。事实证明,这种追踪非常昂贵,而你需要选择使用preserverreferences使圆形地图工作。或者,您可以配置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 ? -
.PreserveReferences()
是干什么用的?
PreserveReferences
将使地图的行为像您习惯的AutoMapper4
一样。它将使AutoMapper
跟踪映射的内容并防止它导致溢出。
另一个选项是设置您希望AutoMapper
遍历的深度。通过设置深度,它将映射一个自引用模型指定的次数。
循环引用可以是这样的类:
public class Category
{
public int Id {get;set;}
public Category Child {get;set;}
public string Value {get;set;}
}
一个引用自己的类,属性Child
意味着你可以多次嵌套这个对象