Como usar o AutoMapper .ForMember?

88

Estou tentando configurar o AutoMapper para converter de Entidade em DTO. Sei que devo usar o .ForMember()after Mapper.CreateMap<Entity, DTO>()para configurar mapeamentos personalizados, mas esse não parece ser um método disponível.

Edite para esclarecimento: Não estou procurando um link para a documentação que li, ou uma explicação da sintaxe básica. Estou usando a sintaxe correta conforme descrito nas respostas e na documentação, por exemplo:

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

Se eu tiver um nome de tipo inválido em CreateMap <>, posso ver "ForMember" como um método válido, passar o mouse mostra a assinatura do método como eu normalmente esperaria. Mas assim que eu dou dois tipos válidos, ForMember diz que ele não pode resolver o símbolo, como se o método não estivesse disponível.

Existe algum tipo de restrição nas classes genéricas que não estou atendendo?

obrigado

Nellius
fonte
2
automapper.codeplex.com/… É provavelmente a melhor documentação para o que você está procurando fazer. Não se esqueça dos parâmetros genéricos na chamada CreateMap.
Travis
2
Deve-se notar que os Mapper.CreateMap<Source, Dest>()métodos estáticos referenciados em todas as respostas abaixo estão agora (2016) marcados como obsoletos .
Ben Ripley

Respostas:

132

Experimente a seguinte sintaxe:

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

ou se as propriedades de origem e destino têm os mesmos nomes simplesmente:

Mapper.CreateMap<Entity, EntityDto>();

Verifique as seções relevantes da documentação para obter mais detalhes e outros cenários de mapeamento.

Darin Dimitrov
fonte
1
Meu problema é que, ao tentar usar "ForMember" nesse contexto, simplesmente recebo "Não é possível resolver o símbolo 'ForMember'" como se o método não existisse
Nellius
@Nellius, você não mostrou seu código que não funciona . Eu mostrei um exemplo prático. Certifique-se de ter as classes genéricas de origem e de destino definidas, de ter referenciado o AutoMapper dentro de seu projeto e a sintaxe mostrada na documentação (e em minha resposta) funcionará.
Darin Dimitrov
4
Pergunta estúpida, o que significa opt?
riadh gomri
@riadhgomri opção / opções para o membro
andrewb
17

No final, acredito que isso acabou sendo algum tipo de incompatibilidade com o ReSharper.

O ReSharper parece ter causado a exibição incorreta do código do Automapper, mas funciona perfeitamente (embora apareça em vermelho com mensagens de erro). A desinstalação do ReSharper corrigiu esse problema completamente.

Nellius
fonte
2
Qual versão do ReSharper? Qual versão do AutoMapper?
Colin Pear
1
Acho que esse problema afeta o AutoMapper e o ReSharper 8.x no VisualStudio 2010. Consulte github.com/AutoMapper/AutoMapper/issues/381
dthrasher
o mesmo para mim com re # 8.2, mas com vs 2012, com 7.0 funcionou bem.
Carlos Guillermo Bolaños Lopez
por que a resposta com 51 votos a favor não é a resposta selecionada? ridículo.
Chris Hawkes
4
Porque não respondeu à pergunta que fiz. Minha dúvida era sobre os métodos não parecem ser reconhecidos no visual studio, ao usar a sintaxe correta e referenciar tudo corretamente. Isso acabou sendo um bug relacionado ao resharper. A outra resposta responde a uma pergunta muito semelhante à que fiz, mas era uma resposta completamente incorreta para a que eu realmente fiz.
Nellius
9

uma implementação de amostra seria a seguinte:

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

Precisamos mapear essa propriedade, pois os nomes das propriedades de Game e GameViewModel são diferentes - se eles forem iguais e do mesmo tipo, não será necessário um ForMember

outro uso do ForMember é ignorar mapeamentos

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

Este uso, bem como:

  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
fonte
-8

Você está fazendo assim

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

Esta página tem alguns bons exemplos

Richard Forrest
fonte