2012-07-24 41 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,它已經過時並且很快就不會被支持。