2

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?
  • .PreserveReferences()为了什么?
4

1 回答 1

4

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

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

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

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

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

于 2016-11-17T11:09:27.237 回答