2012-07-24 2 views
14

Ich verwende Autoadapter, um Quell- und Zielobjekte zuzuordnen. Während ich sie abbilde, erhalte ich den folgenden Fehler.Automapper-Ausdruck muss auf oberstes Element aufgelöst werden

Ausdruck muss in Element der obersten Ebene aufgelöst werden. Parametername: LambdaExpression

Ich bin nicht in der Lage, das Problem zu lösen.

Meine Quell- und Zielobjekte sind:

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; } 
     } 
} 

I Source.Cars mit Destination.OutputData.Cars Objekt abzubilden haben. Könnten Sie mir bitte dabei helfen?

+1

Können Sie Autoadapterkonfiguration hinzufügen? – k0stya

+0

Ich habe versucht, die Konfiguration hinzuzufügen, es wirft Fehler beim Ausführen der Konfigurationen. Meine Konfiguration sieht wie folgt aus: Mapper.CreateMap () .Member (dest => dest.OutputData.Cars, input => input.MapFrom (i => i.Cars)); Der Ausdruck 'dest => dest.OutputData.Cars' muss in das Element der obersten Ebene aufgelöst werden. Parametername: LambdaExpression –

Antwort

15
  1. definieren Zuordnung zwischen Source und OutputData.

    Mapper.CreateMap<Source, OutputData>(); 
    
  2. Aktualisieren Sie Ihre Konfiguration Destination.Output mit OutputData abzubilden.

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

Danke für die schnelle Antwort. –

+0

Ich habe Feld in den OutputData, die einige Standardwerte haben. Ich habe kein Mapping für dieses Feld in der Quelle. Also habe ich es nicht abgebildet. Nachdem das Mapping abgeschlossen ist, wird mein Standardwert auf dem Ziel auf Null gesetzt. Wie vermeidet man, dass es auf einen Nullwert gesetzt wird. –

23

Sie verwenden:

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

Das wird nicht funktionieren, weil Sie 2 Ebene im dest Lambda verwenden.

Mit Automapper können Sie nur 1 Ebene zuordnen. Um das Problem zu beheben, müssen Sie eine Ebene verwenden:

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

Auf diese Weise können Sie Ihre Autos auf das Ziel einstellen.

+0

Auch diese Lösung für die Zuordnung zwischen Objekten verwendet, wo die Quelle hatte 'string somethingKey' und' string somethingValue', und das Ziel hatte 'Objekt etwas {string Key, string Wert}' – st3inn

+0

Greate Answer !! – Ricardo

4

Sie können es auf diese Weise tun:

// 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)); 

Das ist mein Weg, das zu tun ;-)

+0

Dies ist die beste Lösung – Pachu

+0

Funktioniert perfekt, wenn Sie IDataRecord zu komplexen DTO zuordnen möchten. – ironcurtain

0

Die richtige Antwort von allrameest auf diese Frage gegeben sollte helfen: AutoMapper - Deep level mapping

Dies ist Was Sie brauchen:

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)); 

Verwenden Sie bei Verwendung des Mappers:

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

Dabei ist destinationObj eine Instanz von Destination und sourceObj eine Instanz von Source.

HINWEIS: Sie sollten versuchen, sich von der Verwendung von Mapper.CreateMap zu entfernen, da diese veraltet ist und bald nicht mehr unterstützt wird.

Verwandte Themen