迁移到 AutoMapper 5 - 循环引用

gsh*_*arp 2 .net c# automapper automapper-5

System.StackOverflowException我在尝试在 AutoMapper 5 中映射以前在 AutoMapper 4 中使用的某些内容时遇到了问题。

经过一番谷歌搜索后,我发现它是由Circularreferences引起的。

AutoMapper 文档说:

以前,AutoMapper 可以通过跟踪映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表以查看该项目是否已映射。事实证明,这种跟踪非常昂贵,您需要选择使用 PreserveReferences 才能使圆形地图发挥作用。或者,您可以配置 MaxDepth:

// Self-referential mapping
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);

// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();
Run Code Online (Sandbox Code Playgroud)

所以我添加.MaxDepth(3)到我的代码中,它现在又可以工作了。

但是我不明白真正的问题是什么以及我通过添加该行做了什么:)

我的问题:

  • 对于 Category/CategoryDto 而言,“循环引用”是什么意思?
  • 究竟是做什么的.MaxDepth()?为什么示例中使用 3?
  • 是.PreserveReferences()为了什么?

NPh*_*ips 5

PreserveReferences将使地图表现得像AutoMapper4您习惯的那样。它将AutoMapper跟踪映射的内容并防止其导致溢出。

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

循环引用将是一个类,例如:

public class Category
{
    public int Id {get;set;}
    public Category Child {get;set;}
    public string Value {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

类引用自身,属性Child意味着您可以多次嵌套该对象。