Come utilizzare AutoMapper .ForMember?


88

Sto cercando di configurare AutoMapper per convertire da Entity a DTO. So che dovrei usare .ForMember()dopo Mapper.CreateMap<Entity, DTO>()per impostare mappature personalizzate, ma questo non sembra essere un metodo disponibile.

Modifica per chiarimenti: non sto cercando un collegamento alla documentazione, che ho letto, o una spiegazione della sintassi di base. Sto usando la sintassi corretta come descritto nelle risposte e nella documentazione, ad esempio:

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

Se ho un nome di tipo non valido all'interno di CreateMap <> posso vedere "ForMember" come metodo valido, passare il mouse sopra mostra la firma del metodo come normalmente mi aspetterei. Ma non appena gli do due tipi validi, ForMember dice che non può risolvere il simbolo, come se il metodo non fosse disponibile.

C'è qualche tipo di vincolo sulle classi generiche che non sto rispettando?

Grazie


2
automapper.codeplex.com/… È probabilmente la migliore documentazione per ciò che stai cercando di fare. Non dimenticare i parametri generici sulla chiamata CreateMap.
Travis

2
Va notato che i Mapper.CreateMap<Source, Dest>()metodi statici a cui si fa riferimento in tutte le risposte seguenti sono ora (2016) contrassegnati come obsoleti .
Ben Ripley

Risposte:


130

Prova la seguente sintassi:

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

o se le proprietà di origine e di destinazione hanno lo stesso nome semplicemente:

Mapper.CreateMap<Entity, EntityDto>();

Consulta le sezioni pertinenti della documentazione per maggiori dettagli e altri scenari di mappatura.


1
Il mio problema è che quando provo a utilizzare "ForMember" in quel contesto ottengo semplicemente "Impossibile risolvere il simbolo" ForMember "" come se il metodo non esistesse
Nellius

@Nellius, non hai mostrato il tuo codice non funzionante . Ho mostrato un esempio funzionante. Assicurati di aver definito sia la classe generica di origine che quella di destinazione, di aver fatto riferimento a AutoMapper all'interno del tuo progetto e la sintassi mostrata nella documentazione (e nella mia risposta) funzionerà.
Darin Dimitrov

4
Domanda stupida, cosa significa opt?
riadh gomri

@riadhgomri opzione / opzioni per il membro
andrewb

17

Alla fine, credo che questa si sia rivelata una sorta di incompatibilità con ReSharper.

ReSharper sembra aver causato la visualizzazione errata del codice Automapper, ma funziona perfettamente (anche se viene visualizzato in rosso con messaggi di errore). La disinstallazione di ReSharper ha risolto completamente questo problema.


2
Quale versione di ReSharper? Quale versione di AutoMapper?
Colin Pear

1
Penso che questo problema riguardi AutoMapper e ReSharper 8.x in VisualStudio 2010. Vedi github.com/AutoMapper/AutoMapper/issues/381
dthrasher

lo stesso per me con re # 8.2 ma con vs 2012, con 7.0 ha funzionato bene.
Carlos Guillermo Bolaños Lopez

perché la risposta con 51 voti positivi non è la risposta selezionata? ridicolo.
Chris Hawkes

4
Perché non ha risposto alla domanda che ho posto. La mia domanda riguardava i metodi che non sembravano essere riconosciuti in Visual Studio, quando si utilizzava la sintassi corretta e si faceva riferimento a tutto correttamente. Questo si è rivelato essere un bug relativo a resharper. L'altra risposta risponde a una domanda molto simile a quella che ho chiesto, ma era una risposta completamente errata a quella che ho effettivamente chiesto.
Nellius

9

un'implementazione di esempio sarebbe la seguente:

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

Dobbiamo mappare questa proprietà poiché i nomi delle proprietà di Game e GameViewModel sono diversi: se sono uguali e dello stesso tipo, non sarà necessario un ForMember

un altro uso del ForMember è quello di ignorare le mappature

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

1

Questo uso oltre a:

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

-8

Lo stai facendo in questo modo

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

Questa pagina contiene alcuni buoni esempi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.