迁移到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()是干什么用的?

迁移到AutoMapper 5 -循环引用

PreserveReferences将使地图的行为像您习惯的AutoMapper4一样。它将使AutoMapper跟踪映射的内容并防止它导致溢出。

另一个选项是设置您希望AutoMapper遍历的深度。通过设置深度,它将映射一个自引用模型指定的次数。

循环引用可以是这样的类:

public class Category
{
    public int Id {get;set;}
    public Category Child {get;set;}
    public string Value {get;set;}
}

一个引用自己的类,属性Child意味着你可以多次嵌套这个对象