3

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

4

0 回答 0