2012-11-04 4 views
5

나는 this example on AutoMapper's GirHub을 읽었지만, 예를 하나만 적 InnerSource를 매핑하는 방법이있을 것입니다 가정 : EF로 만든, 내가 객체를 직렬화하고있어 내 프로젝트와AutoMapper 복잡한 중첩 된 매핑

Mapper.CreateMap<OuterSource, OuterDest>(); 
Mapper.CreateMap<InnerSource, InnerDest>(); 
Mapper.AssertConfigurationIsValid(); 

var source = new OuterSource 
    { 
     Value = 5, 
     Inner = new InnerSource {OtherValue = 15} 
    }; 

var dest = Mapper.Map<OuterSource, OuterDest>(source); 

그 순환 참조가있다. 그 이유는 서로 다른 방향의 물건을 찾아야하기 때문입니다. 예를 들어, 사용자 목록을 요청하면 관련된 프로젝트를보고 싶습니다. 프로젝트를 요청하면 해당 프로젝트와 관련된 사용자를보고 싶습니다.

이 순환 참조 등 User.Role.Project.TaskTime.User, User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User처럼

그래서 나는 상당히 깊이로 중첩 된 매핑을 필요로 상당히 깊은 얻을 수 있고, 당신이 일을 끝낼 방법은 첫 번째 매핑이 무엇인지에 따라 달라집니다.

현재 내가하고 있어요 :

Mapper.CreateMap<User, UserFull>() 
    .ForMember("TaskTimes", opt => opt.MapFrom(src => Mapper.Map<ICollection<TaskTime>, UserTaskTime>(src.TaskTimes))); 
Mapper.CreateMap<TaskTime, UserTaskTime>() 
    .ForMember("Task", opt => opt.MapFrom(src => Mapper.Map<Task, UserTaskTimeTask>(src.Task))); 
//... 

viewmodels을 그 조각이 모습이 바로이

public class UserFull 
{ 
    public string Email { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<TaskTime> TaskTimes { get; set; } 
    //... 
} 

public class UserTaskTime 
{ 
    public int Id { get; set; } 
    public Task Task { get; set; } 
    //... 
} 

public class UserTaskTimeTask 
{ 
    //... 
} 

인가? 뷰 모델에서 각 멤버를 투영하고 프로젝션을 사용하여 손으로 매핑해야합니까? 아니면 이것을하는 더 깨끗한 방법이 있습니까?

+0

오토메이더를 사용하여 ViewModel의 값을 DB 엔터티에 매핑하고 있습니까? 이 목적을 위해 AutoMapper를 사용하지 말고 수동으로하지 말라고 강력히 조언합니다. 그렇지 않으면 맵핑을 위해 이전 엔티티를 사용하는 새로운 엔티티를 추가하는 경우 계속 실패 할 복잡한 맵퍼 프로파일로 끝납니다. –

답변

0

각 구성원에게 투영 된 중첩 매핑을 수행 할 수 있습니다. 비슷한 대답은 내가 here 게시했습니다. 희망이 도움이됩니다.

+0

그 대답은 중첩 된 배열의 평면화에 관한 것입니다. 저는 그가 엔티티가 서로를 참조하는 http://stackoverflow.com/questions/13337063/nested-mappings-with-instance-version-of-automapper와 같은 것을 추종했다고 생각합니다. – Mightymuke

+0

오 - 방금 그 포스터가 똑같은 것을 알았습니다 :) – Mightymuke

+0

예, 제가 오토 마퍼의 인스턴스 버전을 사용하여 알아 낸 다른 질문을 물어봤을 때, 제가 여기있는 문제를 거의 해결했습니다. –