2017-09-07 9 views
3

ViewModel을 모델에 매핑하는 데 AutoMapper을 사용하고 있습니다. 그러나 해당 원본 속성이 null 인 경우 속성을 매핑하지 않습니다.AutoMapper - 매핑 null 속성 건너 뛰기

public class Source 
{ 
    //Other fields... 
    public string Id { get; set; } //This should not be mapped if null 
} 

그리고 대상 클래스는 다음과 같습니다 :

public class Destination 
{ 
    //Other fields... 
    public Guid Id { get; set; } 
} 

그리고 여기가 매퍼 구성하는 방법입니다 : 내가 생각

Mapper.Initialize(cfg => 
{ 
    //Other mappings... 
    cfg.CreateMap<Source, Destination>() 
     .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)); 
}); 

을 다음과 같이

내 소스 클래스입니다 매핑은 원본이 하나 인 경우 대상에서 속성이 덮어 쓰이지 않음을 의미합니다. null. 하지만 분명히 틀렸어. Source.Id이 null 일 때도 맵핑이 계속되는 경우에도 AutoMapper는 빈 Guid (00000000-0000-0000-0000-000000000000)를 할당하여 기존 메시지를 덮어 씁니다. 소스가 null 인 경우 AutoMapper가 속성 매핑을 건너 뛰도록 올바르게 지시하는 방법은 무엇입니까?

참고 : : Guid<->String 변환에 문제가 있다고 생각하지 않습니다. 이러한 변환은 자동 매기기에서 작동하며, 필자는이를 사용했습니다. 문제는 null 일 때 Id 속성을 건너 뛰지 않는다는 것입니다.

답변

4

쉬운 방법은 null과 Guid.Empty를 구분할 필요가 없다는 것입니다. 이 경우이

cfg.CreateMap<Source, Destination>() 
     .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => ((Guid)srcMember) != Guid.Empty)); 

소스 멤버는 당신이에서지도 문자열 값이 아닙니다처럼, 그것은 대상에 할당 할 것입니다 해결 된 값입니다. 구조체 인 Guid 유형이므로 null이 될 수 없습니다. null 문자열은 Guid.Empty에 매핑됩니다. here을 참조하십시오.

+0

음 ... 시도해 볼 것이지만, 왜 이것이 작동하지 않는지 이해할 수 없습니다. srcMember가 null이면 표현식이 false를 반환합니다. "srcMember! = null"동일한 상황을 확인하십시오. 왜 내 것이 아니라면 너 일해야하지? –

+1

설명을 추가했습니다. –