2014-10-30 2 views
2

나는 AutoMapper 작업을 얻으려고 노력 중이며 간단한 작업으로 막혀있다. 나는 사용자 개체에 정의 된 복합 형식이 있습니다Automapper, complex property and inheritance

[ComplexType] 
public class CustomerProfile 
{ 
    public string  FirstName    { get; set; } 
    public string  LastName     { get; set; } 
    // ... 
} 

public class User 
{ 
    public long Id {get; set;} 
    public string Email { get; get; } 
    public CustomerProfile CustomerProfile { get; set; } 
} 

을 그리고 난 그런보기 모델이 있습니다

public class CustomerViewModel : CustomerProfile 
{ 
    public string Email { get; set; } 
} 

그래서 난 그냥보기 모델 플러스 이메일에 CustomerProfile의 모든 속성을 가지고 있습니다.

사용자를 CustomerViewModel에 매핑하려고합니다. 나는 모든 것을 시도했지만 실제로 성공하지 못했습니다. 이 코드조차도 작동하지 않습니다.

Mapper.CreateMap<CustomerProfile, CustomerViewModel>(); 

오토 맵퍼는 아무 것도 매핑하지 않습니다.

어떻게 매핑 될 수 있습니까? 감사.

+2

입니다이 UserCustomerViewModel 매핑에 의해 처리되기 때문에 당신은 또한 CustomerProfileCustomerViewModel →지도에서 CustomerViewModelEmail 속성을 무시합니다 그것은 "작동하지 않습니다"그리고 어떻게 작동하지 않습니까? – Default

답변

2

.ConstructUsing을 사용하면 User 인스턴스에서 CustomerViewModel을 만들 수 있습니다. 그런 다음 나머지 특성 (예를 들면, Email는) AutoMapper에 의해 자동으로 매핑됩니다은 긴 이름이 일치 같이

Mapper.CreateMap<CustomerProfile, CustomerViewModel>(); 

Mapper.CreateMap<User, CustomerViewModel>() 
    .ConstructUsing(src => Mapper.Map<CustomerViewModel>(src.CustomerProfile)); 

예 :https://dotnetfiddle.net/RzpD4z


업데이트

하려면 AssertConfigurationIsValid()이 통과하면 수동으로 매핑 한 속성을 무시해야합니다.

Mapper.CreateMap<CustomerProfile, CustomerViewModel>() 
    // Ignore Email since it's mapped by the User to CustomerViewModel mapping. 
    .ForMember(dest => dest.Email, opt => opt.Ignore()); 

Mapper.CreateMap<User, CustomerViewModel>() 
    .ConstructUsing(src => Mapper.Map<CustomerViewModel>(src.CustomerProfile)) 
    // Ignore FirstName/LastName since they're mapped above using ConstructUsing. 
    .ForMember(dest => dest.FirstName, opt => opt.Ignore()) 
    .ForMember(dest => dest.LastName, opt => opt.Ignore()); 

업데이트 예 : 그것은 무엇https://dotnetfiddle.net/KitDiC

+0

Btw, 이것이 작동하지 않는 이유를 알고 계십니까? https://dotnetfiddle.net/hXlNKY –

+0

@RomanPushkin : 그래, 당신은 'ConstructUsing' 호출로 매핑하는 속성을 무시해야합니다. 지적 해 주셔서 고맙습니다, 나는 내 대답을 업데이트 할 것입니다. –