自动映射器找不到未映射的成员

我们正在使用Automapper进行项目,并且似乎随机获得以下错误:

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

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

Mapper.AssertConfigurationIsValid(); 

不知道为什么它抱怨映射不好然后刷新再次没问题,有没有人碰到这个? 调试没有帮助,因为它是随机的,有时没有错误,然后其他日子它将在网站的某个地方弹出,回到它并且没关系。 错误也出现在随机页面上,而不是相同的页面,而不是相同的映射。

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

比如你有一个Car.cs要映射到CarDTO.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(); Mapper.CreateMap(); Mapper.CreateMap(); Mapper.CreateMap(); 

一切都很好看,对吧? 但是,在你的EngineDTO ,你可能有一个导航属性,比方说:

 public class EngineDTO { public List Parts { get; set; } } 

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

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

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

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

编辑:

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

轮廓:

 public class CarProfile : Profile { public CarProfile () { CreateMap(); } } 

Global.asax中:

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