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

时间:2014-12-08 14:19:28

标签: c# asp.net automapper

我们正在为项目使用Automapper,并且似乎随机出现以下错误:

  

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

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

Mapper.AssertConfigurationIsValid();

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

3 个答案:

答案 0 :(得分:55)

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

cfg.ValidateInlineMaps = false;

但是,你应该理解为什么问题首先出现 - 所以请随时阅读。

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

比如说你有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<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());

编辑:

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

资料:

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

的Global.asax:

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

答案 1 :(得分:11)

这与验证有关。

cfg.ValidateInlineMaps = false;

应该足够

答案 2 :(得分:0)

就我而言,我忘记了将Map Configuration添加到MapConfig.cs。