迁移到AutoMapper 5 - 循环引用

时间:2016-11-17 09:03:39

标签: c# .net automapper automapper-5

我尝试在AutoMapper 5中映射一些以前在AutoMapper 4中工作的东西时有System.StackOverflowException

在谷歌搜索后,我发现它是由Circular references引起的。

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)添加到我的代码中,现在又可以了。

然而,我并没有说明真正的问题是什么以及我通过添加这一行做了什么:)

我的问题:

  • 什么意思&#39;循环引用&#39;关于Category / CategoryDto?
  • .MaxDepth()究竟是什么?为什么样本中使用了3?
  • 什么是.PreserveReferences()

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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