Comment utiliser AutoMapper .ForMember?

88

J'essaye de configurer AutoMapper pour convertir d'entité en DTO. Je sais que je suis censé utiliser .ForMember()after Mapper.CreateMap<Entity, DTO>()pour configurer des mappages personnalisés, mais cela ne semble pas être une méthode disponible.

Modifier pour clarification: je ne cherche pas de lien vers la documentation, que j'ai lu, ni une explication de la syntaxe de base J'utilise la syntaxe correcte comme décrit dans les réponses et la documentation, par exemple:

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

Si j'ai un nom de type invalide dans CreateMap <>, je peux voir "ForMember" comme une méthode valide, la souris sur affiche la signature de la méthode comme je m'y attendrais normalement. Mais dès que je lui donne deux types valides, ForMember dit qu'il ne peut pas résoudre le symbole, comme si la méthode n'était pas disponible.

Y a-t-il une sorte de contrainte sur les classes génériques que je ne rencontre pas?

Merci

Nellius
la source
2
automapper.codeplex.com/ ... Est probablement la meilleure documentation pour ce que vous cherchez à faire. N'oubliez pas les paramètres génériques de l'appel CreateMap.
Travis
2
Il est à noter que les Mapper.CreateMap<Source, Dest>()méthodes statiques référencées dans toutes les réponses ci-dessous sont désormais (2016) marquées obsolètes .
Ben Ripley

Réponses:

130

Essayez la syntaxe suivante:

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

ou si les propriétés source et destination ont simplement les mêmes noms:

Mapper.CreateMap<Entity, EntityDto>();

Veuillez consulter les sections pertinentes de la documentation pour plus de détails et d'autres scénarios de cartographie.

Darin Dimitrov
la source
1
Mon problème est que lorsque j'essaye d'utiliser «ForMember» dans ce contexte, j'obtiens simplement «Impossible de résoudre le symbole« ForMember »» comme si la méthode n'existait pas
Nellius
@Nellius, vous n'avez pas montré votre code qui ne fonctionne pas . J'ai montré un exemple fonctionnel. Assurez-vous que les classes génériques source et de destination sont définies, que vous avez référencé AutoMapper dans votre projet et que la syntaxe indiquée dans la documentation (et dans ma réponse) fonctionnera.
Darin Dimitrov
4
Question stupide, que signifie opt?
riadh gomri
@riadhgomri option / options pour le membre
andrewb
17

En fin de compte, je pense que cela s'est avéré être une sorte d'incompatibilité avec ReSharper.

ReSharper semble avoir provoqué un affichage incorrect du code Automapper, mais fonctionne très bien (même s'il s'affiche en rouge avec des messages d'erreur). La désinstallation de ReSharper a complètement résolu ce problème.

Nellius
la source
2
Quelle version de ReSharper? Quelle version d'AutoMapper?
Colin Pear
1
Je pense que ce problème affecte AutoMapper et ReSharper 8.x dans VisualStudio 2010. Voir github.com/AutoMapper/AutoMapper/issues/381
dthrasher
la même chose pour moi avec re # 8.2 mais avec vs 2012, avec 7.0 fonctionnait bien.
Carlos Guillermo Bolaños Lopez
pourquoi la réponse avec 51 votes positifs n'est-elle pas la réponse choisie? ridicule.
Chris Hawkes
4
Parce qu'il n'a pas répondu à la question que j'ai posée. Ma question portait sur les méthodes ne semblant pas être reconnues dans Visual Studio, lors de l'utilisation de la syntaxe correcte et du référencement de tout correctement. Cela s'est avéré être un bug lié au resharper. L'autre réponse répond à une question très similaire à celle que j'ai posée, mais c'était une réponse complètement incorrecte à celle que j'ai réellement posée.
Nellius
9

un exemple d'implémentation serait le suivant:

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

Nous devons mapper cette propriété car les noms des propriétés de Game et GameViewModel sont différents - s'ils sont identiques et du même type, il n'aura pas besoin d'un ForMember

une autre utilisation du ForMember est d'ignorer les mappages

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

Cette utilisation ainsi que:

  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
la source
-8

Fais-tu comme ça

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

Cette page contient de bons exemples

Richard Forrest
la source