106 votes

Comment utiliser AutoMapper .ForMember?

Je cherche à configurer AutoMapper pour convertir d'une entité à un DTO. Je sais que je suis censé utiliser .ForMember() après Mapper.CreateMap() pour configurer des mappages personnalisés, mais cette méthode ne semble pas être disponible.

Éditer pour plus de clarification : Je ne cherche pas un lien vers la documentation, que j'ai lue, ou une explication de la syntaxe de base. Je suis en train d'utiliser la syntaxe correcte comme décrit dans les réponses et la documentation, par exemple :

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

Si j'ai un nom de type invalide dans CreateMap<>, je peux voir que "ForMember" est une méthode valide, en survolant la souris, je vois la signature de la méthode comme je m'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 respecte pas ?

Merci

167voto

Darin Dimitrov Points 528142

Essayez la syntaxe suivante :

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

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

Mapper.CreateMap();

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

1 votes

Mon problème est que lorsque j'essaie d'utiliser "ForMember" dans ce contexte, je reçois simplement "Cannot resolve symbol 'ForMember'", comme si la méthode n'existait pas.

0 votes

@Nellius, vous n'avez pas montré votre code non fonctionnel. J'ai montré un exemple fonctionnel. Assurez-vous d'avoir à la fois les classes génériques source et destination définies, d'avoir référencé AutoMapper dans votre projet et que la syntaxe indiquée dans la documentation (et dans ma réponse) fonctionnera.

6 votes

Question stupide, que signifie opt?

19voto

Nellius Points 922

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

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

2 votes

Quelle version de ReSharper? Quelle version d'AutoMapper?

2 votes

Je pense que ce problème affecte AutoMapper et ReSharper 8.x dans VisualStudio 2010. Voir github.com/AutoMapper/AutoMapper/issues/381

0 votes

Pour moi, c'est pareil avec la référence n° 8.2 mais avec VS 2012, avec 7.0 ça fonctionnait bien.

10voto

stack72 Points 5146

Une implémentation d'exemple serait la suivante :

Mapper.CreateMap()
  .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, alors cela ne nécessitera pas de ForMember

Une autre utilisation du ForMember est d'ignorer les mappings

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

1voto

Mojtaba Nava Points 124

Ceci est utilisé ainsi que :

  CreateMap()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

1voto

Zara Gibbons Points 1
 CreateMap()
            .ForMember(opt => opt.NombreEtudiant, conf => conf.MapFrom(x => x.Etudiant == null ? (long?)null : x.Etudiant.NumeroEtudiant))
            .ForMember(opt => opt.NomCompletEtudiant, conf => conf.MapFrom(x => x.Etudiant == null ? null : x.Etudiant.Nom + " " + x.Etudiant.Prenom))
            .ReverseMap()
            .ForMember(opt => opt.Etudiant, conf => conf.Ignore());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X