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

时间:2018-10-12 13:03:54

标签: c# entity-framework-6 stack-overflow automapper-6

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

  
      
  • 设置MaxDepth(全局)
  •   
  • 设置PreserveReferences(全局)
  •   
  • 启用/禁用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();
    }
}

但是,如果根本不设置这些假定的循环引用属性,即为NULL,也会出现问题。但是,如果您从类中完全删除这些属性,则不会再发生此错误。

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

CreateMap<One, OneDTO>().ReverseMap();

AssertConfigurationIsValid方法充满了有关“找到未映射成员的警告。

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

请注意是否相关:我们将SimpleInjector用作DI容器,用于将MappingConfiguration绑在中央位置并将其注入到    依赖IMapper的必需位置。

0 个答案:

没有答案