我尝试在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)
添加到我的代码中,现在又可以了。
然而,我并没有说明真正的问题是什么以及我通过添加这一行做了什么:)
我的问题:
.MaxDepth()
究竟是什么?为什么样本中使用了3?.PreserveReferences()
?答案 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
表示您可以多次嵌套此对象。