C# AutoMapper 6.2.2映射具有循环引用的对象时抛出StackOverflowException(尽管相应的属性为NULL)

C# AutoMapper 6.2.2映射具有循环引用的对象时抛出StackOverflowException(尽管相应的属性为NULL),c#,entity-framework-6,stack-overflow,automapper-6,C#,Entity Framework 6,Stack Overflow,Automapper 6,我们使用EntityFramework 6.2.0和Automapper 6.2.2在实体和DTO之间进行映射。 不幸的是,对于其中一些映射,System.StackOverflowException会反复出现。 经过广泛的研究,我们已经尝试了几种方法来解决这个问题: 设置最大深度(全局) 设置保留引用(全局) 启用/禁用CreateMissingTypeMaps(全局) 试图理解执行计划 到目前为止,还没有解决这个问题。各种文章描述了DTO中应避免循环引用,不幸的是,我们的情况并非如此 循

我们使用EntityFramework 6.2.0和Automapper 6.2.2在实体和DTO之间进行映射。 不幸的是,对于其中一些映射,System.StackOverflowException会反复出现。 经过广泛的研究,我们已经尝试了几种方法来解决这个问题:

  • 设置最大深度(全局)
  • 设置保留引用(全局)
  • 启用/禁用CreateMissingTypeMaps(全局)
  • 试图理解执行计划
到目前为止,还没有解决这个问题。各种文章描述了DTO中应避免循环引用,不幸的是,我们的情况并非如此

循环参考示例:

public class OneDTO
{
    public Guid Id { get; set; }
    public List<OtherDTO> Others { get; set; }
}

public class OtherDTO
{
    public Guid Id { get; set; }
    public OneDTO One { get; set; }
}

public class Profiles : Profiles
{
    public Profiles()
    {
        CreateMap<One, OneDTO>().ReverseMap();
        CreateMap<Other, OtherDTO>().ReverseMap();
    }
}
公共类OneDTO
{
公共Guid Id{get;set;}
公共列表其他{get;set;}
}
公共类OtherDTO
{
公共Guid Id{get;set;}
public OneDTO One{get;set;}
}
公共类配置文件:配置文件
{
公众简介()
{
CreateMap().ReverseMap();
CreateMap().ReverseMap();
}
}
但是,如果根本没有设置这些假定的循环引用属性,即为空,也会出现问题。但是,如果从类中完全删除这些属性,则不再发生错误

除了循环引用之外,还有其他可能的原因吗?此错误是否也会由于配置错误而发生?在大多数情况下,我们使用这样的映射:

CreateMap<One, OneDTO>().ReverseMap();
CreateMap().ReverseMap();
AssertConfigurationsValid方法充满了关于“未映射成员已找到”的警告

我们问自己的主要问题是,我们是否忽略了配置、配置错误,或者是否真的需要从DTO中删除所有循环引用

如果相关,请注意:我们使用SimpleInjector作为DI容器,用于将MappingConfiguration捆绑在中心位置,并将其注入到 存在对IMapper依赖关系的必需位置。

创建一个我们可以执行并看到失败的选项。