AutoMapper .ForMember를 사용하는 방법?


88

Entity에서 DTO로 변환하도록 AutoMapper를 설정하려고합니다. 사용자 지정 매핑을 설정하기 위해 .ForMember()after 를 사용해야한다는 것을 알고 Mapper.CreateMap<Entity, DTO>()있지만 이것은 사용 가능한 방법이 아닌 것 같습니다.

설명 편집 : 내가 읽은 문서에 대한 링크 나 기본 구문에 대한 설명을 찾고 있지 않습니다. 답변 및 설명서에 설명 된대로 올바른 구문을 사용하고 있습니다. 예를 들면 다음과 같습니다.

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

CreateMap <> 내에 잘못된 형식 이름이있는 경우 "ForMember"를 유효한 메서드로 볼 수 있습니다. 마우스를 올리면 일반적으로 예상하는 메서드 서명이 표시됩니다. 그러나 두 가지 유효한 유형을 제공하자마자 ForMember는 메서드를 사용할 수없는 것처럼 기호를 확인할 수 없다고 말합니다.

내가 만나지 않는 제네릭 클래스에 어떤 종류의 제약이 있습니까?

감사


2
automapper.codeplex.com/… 수행하려는 작업에 대한 최고의 문서 일 것입니다. CreateMap 호출에서 일반 매개 변수를 잊지 마십시오.
— Travis

2
Mapper.CreateMap<Source, Dest>()아래의 모든 답변에서 참조 된 정적 메서드는 이제 (2016) 사용되지 않는 것으로 표시 됩니다.
— Ben Ripley

답변:


132

다음 구문을 시도하십시오.

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

또는 소스 및 대상 속성의 이름이 단순히 동일한 경우 :

Mapper.CreateMap<Entity, EntityDto>();

자세한 내용 및 기타 매핑 시나리오 는 설명서 의 관련 섹션을 확인하십시오 .


1
내 문제는 해당 컨텍스트에서 "ForMember"를 사용하려고 할 때 메서드가 존재하지 않는 것처럼 단순히 "Cannot resolve symbol 'ForMember'"라는 메시지가 표시
— 된다는 것입니다

@Nellius, 작동하지 않는 코드를 표시하지 않았습니다 . 나는 실제적인 예를 보여 주었다. 소스 및 대상 일반 클래스가 모두 정의되어 있는지, 프로젝트 내에서 AutoMapper를 참조했는지 확인하고 문서 (및 내 대답)에 표시된 구문이 작동하는지 확인하십시오.
— Darin Dimitrov

4
어리석은 질문입니다. opt가 무엇을 의미합니까?
— riadh gomri

@riadhgomri 옵션 / 회원에 대한 옵션
— andrewb

17

결국 저는 이것이 ReSharper와 일종의 비 호환성으로 판명되었다고 생각합니다.

ReSharper로 인해 Automapper 코드가 잘못 표시되는 것 같지만 정상적으로 작동합니다 (오류 메시지와 함께 빨간색으로 표시 되더라도). ReSharper를 제거하면이 문제가 완전히 해결되었습니다.


2
ReSharper의 버전은 무엇입니까? AutoMapper의 버전은 무엇입니까?
— Colin Pear

1
이 문제가 VisualStudio 2010의 AutoMapper 및 ReSharper 8.x에 영향을 미친다고 생각합니다. github.com/AutoMapper/AutoMapper/issues/381
— dthrasher

re # 8.2에서는 동일하지만 2012와 비교하면 7.0에서는 잘 작동했습니다.
— Carlos Guillermo Bolaños Lopez

51 개의 찬성표를 가진 답변이 선택된 답변이 아닌 이유는 무엇입니까? 어리석은.
— Chris Hawkes 2015

4
내가 묻는 질문에 대한 답이 아니기 때문입니다. 내 질문은 올바른 구문을 사용하고 모든 것을 올바르게 참조 할 때 Visual Studio에서 인식되지 않는 방법에 관한 것이 었습니다. 이것은 resharper와 관련된 버그로 밝혀졌습니다. 다른 답변은 제가 요청한 질문과 매우 유사한 질문에 대한 답변을 제공하지만 실제로 요청한 답변에는 완전히 잘못된 답변이었습니다.
— Nellius

9

샘플 구현은 다음과 같습니다.

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

Game과 GameViewModel의 속성 이름이 다르기 때문에이 속성을 매핑해야합니다. 동일하고 유형이 같으면 ForMember가 필요하지 않습니다.

ForMember의 또 다른 용도는 매핑을 무시하는 것입니다.

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

1

이 용도뿐만 아니라 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.