2012-07-18 2 views
1

그래서 이걸 가지고 있습니다.AutoMapper - 선택한 하위 속성을 유지하면서 중첩 매핑

public class Parent 
{ 
    public string SomeProperty { get; set; } 
    public Child ChildProperty { get; set; } 
} 
public class Child 
{ 
    public string ChildProperty { get; set; } 
    public string OtherChildProperty { get; set; } 
} 
public class Flat 
{ 
    public string SomeProperty { get; set; } 
    public string ChildProperty { get; set; } 
} 

그리고 나서 이렇게합니다.

Flat source = new Flat { SomeProperty = "test", ChildProperty = "test" }; 
Parent dest = GetParentFromDataContext(); 

Mapper.Map<Flat,Parent>(source,dest); 

그런 나의 기대는 dest.ChildProperty.OtherChildProperty는 여전히이 데이터 컨텍스트에서 가져온 때 그것이 무엇으로 설정되어 있다는 점이다. 그러나 나는 이것을하기 위해 고심하고있다.

내가 CreateMap 인 경우 "최상위 멤버로 해결해야 함"예외가 발생합니다. 다음과 같은 처리를 할 경우

Mapper.CreateMap<Flat,Parent>() 
    .ForMember(dest => dest.Parent.ChildProperty.ChildProperty, 
    options => options.MapFrom(source => source.ChildProperty)) 
    .ForMember(dest => dest.Parent.ChildProperty.OtherChildProperty, 
    options => options.Ignore()); 

그러나, 다음 new Child {}은 본질적으로 OtherChildProperty을 클리어 데이터 컨텍스트에서 뽑아 Child 대체;

Mapper.CreateMap<Flat,Parent>() 
    .ForMember(dest => dest.Child 
    options => options.MapFrom(source => new Child { ChildProperty = source.ChildProperty })); 

어떻게 매핑하고 무시할 하위 속성을 유지할 수 있습니까?

답변

1

깔끔한,하지만이 작품;

Mapper.CreateMap<Flat,Parent>() 
    .ForMember(dest => dest.ChildProperty, options => options.Ignore()); 
Mapper.CreateMap<Flat,Child>() 
    .ForMember(dest => dest.OtherChildProperty, options => options.Ignore()); 

Mapper.Map<Flat,Parent>(source,dest); 
Mapper.Map<Flat,Child>(source,dest.Child); 
1

automapper를 사용하여 병합 공정을 역전 시키려고하고 있는데 이는 작업에 대한 잘못된 도구 일뿐입니다. this SO 질문을 참조하십시오.

관련 문제