2012-07-24 38 views
14

我正在使用自动映射器来映射源对象和目标对象。当我映射他们时,我得到下面的错误。自动映射表达式必须解析为顶层成员

表达式必须解析为顶级成员。参数名称:lambda表达式

我无法解决问题。

我的源和目标对象是:

public partial class Source 
{ 
     private Car[] cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

public partial class Destination 
{ 
     private OutputData output; 

     public OutputData Output 
     {    
      get { return this.output; } 
      set { this.output= value; } 
     } 
} 

public class OutputData 
{ 
     private List<Cars> cars; 

     public Car[] Cars 
     { 
      get { return this.cars; } 
      set { this.cars = value; } 
     } 
} 

我必须与Destination.OutputData.Cars对象映射Source.Cars。你能帮我解决吗?

+1

您可以添加automapper配置吗? – k0stya 2012-07-24 19:54:29

+0

我试图添加配置,它在运行配置时抛出错误。我的配置如下所示:Mapper.CreateMap ()。ForMember(dest => dest.OutputData.Cars,input => input.MapFrom(i => i.Cars));表达式'dest => dest.OutputData.Cars'必须解析为顶级成员。 参数名称:lambda表达式 – 2012-07-25 06:34:34

回答

15
  1. 定义SourceOutputData之间的映射。

    Mapper.CreateMap<Source, OutputData>(); 
    
  2. 更新你的配置映射Destination.OutputOutputData

    Mapper.CreateMap<Source, Destination>().ForMember(dest => dest.Output, input => 
        input.MapFrom(s=>Mapper.Map<Source, OutputData>(s))); 
    
+0

感谢您的快速回复。 – 2012-07-26 10:25:16

+0

我在OutputData中有一些默认值的字段。源中没有该字段的映射。所以我没有绘制它。映射完成后,我的默认值在目标上设置为空值。如何避免它设置为空值。 – 2012-07-26 10:38:37

23

您正在使用:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData.Cars, 
      input => input.MapFrom(i => i.Cars)); 

,因为你正在使用的DEST拉姆达2级这是行不通的。

使用Automapper时,只能映射到1级。要解决此问题,您需要使用单个级别:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.OutputData, 
      input => input.MapFrom(i => new OutputData{Cars=i.Cars})); 

这样,您可以将汽车设置到目的地。

+0

也使用这种解决方案来源的对象之间有'string something'和'string somethingValue'的对象之间的映射,并且目的地有'对象某事{string Key,string Value}' – st3inn 2013-01-10 14:13:53

+0

Greate Answer !! – Ricardo 2016-11-19 15:07:14

4

你可以做到这样:

// First: create mapping for the subtypes 
Mapper.CreateMap<Source, OutputData>(); 

// Then: create the main mapping 
Mapper.CreateMap<Source, Destination>(). 
    // chose the destination-property and map the source itself 
    ForMember(dest => dest.Output, x => x.MapFrom(src => src)); 

这是我的方式来做到这一点;-)

+0

这是最好的解决方案 – Pachu 2016-03-13 17:00:11

+0

当您希望将IDataRecord映射到复杂的DTO时,它是完美的。 – ironcurtain 2017-10-11 15:00:03

0

通过allrameest对这个问题给出正确的答案应该有所帮助:AutoMapper - Deep level mapping

这是你需要什么:

Mapper.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.OutputData, opt => opt.MapFrom(i => i)); 
Mapper.CreateMap<Source, OutputData>() 
    .ForMember(dest => dest.Cars, opt => opt.MapFrom(i => i.Cars)); 

当使用映射器时,使用:

var destinationObj = Mapper.Map<Source, Destination>(sourceObj) 

其中destinationObj是Destination的一个实例,sourceObj是Source的一个实例。

注意:您应该尽量远离使用Mapper.CreateMap,它已经过时并且很快就不会被支持。