自动映射器未映射成员

本文关键字:映射 成员 | 更新日期: 2023-09-27 18:33:43

我们正在为一个项目使用自动映射器,并且似乎随机收到以下错误:

AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型

代码已经几个月没有更改了。我收到该错误,刷新,错误消失,页面工作正常。 我正在使用

Mapper.AssertConfigurationIsValid();

不知道为什么它抱怨映射不好,然后刷新,又很好,有人遇到过这种情况吗? 调试无济于事,因为它是随机的,有时没有错误,然后其他日子它会在网站上的某个地方弹出,回到它,这很好。 该错误也出现在随机页面上,不是同一页面,也不是相同的映射。

自动映射器未映射成员

快速介绍编辑:正如下面的@mrTurkay答案,这可以通过以下配置来解决:

cfg.ValidateInlineMaps = false;

但是,您应该首先了解为什么会出现问题 - 因此请随时继续阅读。

当您尝试映射未为其创建映射配置的对象时,会出现此问题。您需要记住的是,它不一定是您尝试映射的特定对象;但它是导航属性之一。

例如,假设您有一个要映射到CarDTO.csCar.cs

Car.cs如下所示:

public class Car
{
  public string Color { get; set; }
  public Engine Engine { get; set; }
}

您的 DTO 看起来相同,但引用了EngineDTO

public class CarDTO
{
  public string Color { get; set; }
  public EngineDTO Engine { get; set; }
}

您按如下方式配置了映射:

    Mapper.CreateMap<DTO.CarDTO, Data.Model.Car>();
    Mapper.CreateMap<Data.Model.Car, DTO.CarDTO>();
    Mapper.CreateMap<DTO.EngineDTO, Data.Model.Engine>();
    Mapper.CreateMap<Data.Model.Engine, DTO.EngineDTO>();

一切看起来都很好,对吧?但是,在您的EngineDTO中,您可能有一个导航属性,例如:

public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}

因此,虽然Automapper是从Engine映射到EngineDTO,但它也尝试映射PartDTO,但是由于您忘记在global.asax中声明映射,因此会出现错误:

AutoMapper.AutoMapperConfigurationException: 未映射的成员是 发现。查看下面的类型和成员。添加自定义映射 表达式、忽略、添加自定义解析程序或修改 源/目标类型

如果不想映射类上的某些属性,可以使用 Ignore:

Mapper.CreateMap<Engine, EngineDTO>()
    .ForMember(x => x.Parts, opt => opt.Ignore());

编辑:

对于更强大的自动映射器配置,我建议您使用映射配置文件,而不是直接在 Global.asax 中声明映射。下面是一个示例:

轮廓:

public class CarProfile : Profile
{
    public CarProfile ()
    {
        CreateMap<Car, CarDTO>();
    }
}

Global.asax:

Mapper.Initialize(cfg =>
{
     cfg.AddProfile<CarProfile>();
}

这是关于验证的。

cfg.ValidateInlineMaps = false;

应该足够了

就我而言,我忘了将地图配置添加到MapConfig.cs。