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

Par*_*osh 53 c# asp.net automapper

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

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

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

Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*rly 63

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

比如说你有一个Car.cs想要映射到的地方CarDTO.cs

Car.cs如下所示:

cfg.ValidateInlineMaps = false;
Run Code Online (Sandbox Code Playgroud)

你的DTO看起来是一样的,但有一个参考EngineDTO:

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

  public Engine Engine { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您配置了这样的映射:

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

  public EngineDTO Engine { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

    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>();
Run Code Online (Sandbox Code Playgroud)

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

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

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

public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

轮廓:

Mapper.CreateMap<Engine, EngineDTO>()
    .ForMember(x => x.Parts, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

Global.asax中:

public class CarProfile : Profile
{
    public CarProfile ()
    {
        CreateMap<Car, CarDTO>();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @SimonD感谢Simon,我的意思是隐式地忽略成员而不是明确 (13认同)
  • 有没有办法只是忽略未映射的属性? (8认同)
  • @tchelidze是的,你可以忽略属性:".ForMember(dest => dest.Users,options => options.Ignore()" (3认同)

mrT*_*kay 16

这是关于验证.

cfg.ValidateInlineMaps = false;
Run Code Online (Sandbox Code Playgroud)

应该够了

  • 这个答案被大大低估了。我一直在努力将旧的AutoMapper 2.x配置转换为8.x,而无需手动更改数百个映射语句。我的几乎所有地图都是旧格式的简单Mapper.CreateMap &lt;TSource,TDest&gt;()。似乎删除了所有这些并使用AutoMapper.Mapper.Initialize(cfg =&gt; {cfg.ValidateInlineMaps = false; cfg.CreateMissingTypeMaps = true;}); 除了少数情况之外,应用程序启动中的启动是一个足够的替代。 (5认同)
  • 这些建议似乎不再有效,因为 MapperConfiguration 不公开名为 ValidateInlineMaps 的成员,并且 Mapper 不公开名为 Initialize 的成员。 (2认同)