Wie verwende ich AutoMapper .ForMember?

87

Ich versuche, AutoMapper für die Konvertierung von Entität in DTO einzurichten. Ich weiß, dass ich .ForMember()After verwenden soll Mapper.CreateMap<Entity, DTO>(), um benutzerdefinierte Zuordnungen einzurichten, aber dies scheint keine verfügbare Methode zu sein.

Zur Verdeutlichung bearbeiten: Ich suche keinen Link zu der Dokumentation, die ich gelesen habe, oder eine Erklärung der grundlegenden Syntax. Ich verwende die richtige Syntax wie in den Antworten und in der Dokumentation beschrieben, zum Beispiel:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

Wenn ich in CreateMap <> einen ungültigen Typnamen habe, kann ich "ForMember" als gültige Methode sehen. Wenn Sie mit der Maus darüber fahren, wird die Methodensignatur angezeigt, wie ich es normalerweise erwarten würde. Sobald ich ihm zwei gültige Typen gebe, sagt ForMember, dass das Symbol nicht aufgelöst werden kann, als ob die Methode nicht verfügbar wäre.

Gibt es eine Einschränkung für die generischen Klassen, die ich nicht erfülle?

Vielen Dank

Nellius
quelle
2
automapper.codeplex.com/… Ist wahrscheinlich die beste Dokumentation für das, was Sie tun möchten . Vergessen Sie nicht die generischen Parameter beim CreateMap-Aufruf.
Travis
2
Es ist zu beachten, dass die statischen Mapper.CreateMap<Source, Dest>()Methoden, auf die in allen folgenden Antworten verwiesen wird, jetzt (2016) als veraltet markiert sind .
Ben Ripley

Antworten:

128

Versuchen Sie die folgende Syntax:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

oder wenn die Quell- und Zieleigenschaften einfach den gleichen Namen haben:

Mapper.CreateMap<Entity, EntityDto>();

Weitere Informationen und andere Zuordnungsszenarien finden Sie in den entsprechenden Abschnitten der Dokumentation .

Darin Dimitrov
quelle
1
Mein Problem ist, dass ich beim Versuch, "ForMember" in diesem Kontext zu verwenden, einfach "Symbol 'ForMember' kann nicht aufgelöst werden" erhalte, als ob die Methode nicht existiert
Nellius
@Nellius, Sie haben Ihren nicht funktionierenden Code nicht angezeigt . Ich habe ein funktionierendes Beispiel gezeigt. Stellen Sie sicher, dass sowohl die generischen Quell- als auch die Zielklassen definiert sind, dass Sie in Ihrem Projekt auf AutoMapper verwiesen haben und dass die in der Dokumentation (und in meiner Antwort) angegebene Syntax funktioniert.
Darin Dimitrov
4
Dumme Frage, was opt bedeutet?
Riadh Gomri
@riadhgomri Option / Optionen für das Mitglied
andrewb
17

Letztendlich glaube ich, dass sich dies als eine Art Inkompatibilität mit ReSharper herausstellte.

ReSharper scheint dazu geführt zu haben, dass der Automapper-Code falsch angezeigt wird, funktioniert aber einwandfrei (obwohl er rot mit Fehlermeldungen angezeigt wird). Durch die Deinstallation von ReSharper wurde dieses Problem vollständig behoben.

Nellius
quelle
2
Welche Version von ReSharper? Welche Version von AutoMapper?
Colin Pear
1
Ich denke, dieses Problem betrifft AutoMapper und ReSharper 8.x in VisualStudio 2010. Siehe github.com/AutoMapper/AutoMapper/issues/381
dthrasher
das gleiche für mich mit re # 8.2, aber mit vs 2012, mit 7.0 hat gut funktioniert.
Carlos Guillermo Bolaños Lopez
Warum ist die Antwort mit 51 Stimmen nicht die ausgewählte Antwort? lächerlich.
Chris Hawkes
4
Weil es die Frage, die ich gestellt habe, nicht beantwortet hat. Meine Frage betraf die Methoden, die in Visual Studio nicht erkannt zu werden scheinen, wenn die richtige Syntax verwendet und alles richtig referenziert wird. Dies stellte sich als Fehler im Zusammenhang mit Resharper heraus. Die andere Antwort beantwortet eine sehr ähnliche Frage wie die, die ich gestellt habe, aber es war eine völlig falsche Antwort auf die Frage, die ich tatsächlich gestellt habe.
Nellius
9

Eine Beispielimplementierung wäre wie folgt:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

Wir müssen diese Eigenschaft zuordnen, da die Namen der Eigenschaften von Game und GameViewModel unterschiedlich sind. Wenn sie gleich und vom gleichen Typ sind, wird kein ForMember benötigt

Eine andere Verwendung des ForMember ist das Ignorieren von Zuordnungen

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());
stack72
quelle
1

Diese Verwendung sowie:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();
Mojtaba Nava
quelle
-9

Machst du das so?

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

Diese Seite enthält einige gute Beispiele

Richard Forrest
quelle