我们结合使用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的必需位置。