2017-05-16 1 views
1

개체가 있으므로, Sons and Daughters 컬렉션을 가진 Parent라고 부르 자고합니다.컬렉션이있는 오토 맵퍼 매핑 객체

public class Parent { 
    ICollection<Son> ParentsSons { get; set; } 
    ICollection<Daughter> ParentsDaughters { get; set; } 
} 

public class Son { 
    public Parent Parent { get; set; } 
} 

public class Daughter{ 
    public Parent Parent { get; set; } 
} 

앞뒤로 매핑되는 모델 클래스와 데이터 클래스가 있다고 가정합니다.

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<Data.Parent, Models.Parent>() .AfterMap((src, dest) => 
    { 
     foreach (var i in dest.Sons) 
      i.Son = dest; 
     foreach (var i in dest.Daughters) 
      i.Daughters = dest; 
    }) 
    .ReverseMap(); 

    cfg.CreateMap<Data.Son, Models.Son>().ForMember(m => m.Parent, opt => opt.Ignore()).ReverseMap(); 
    cfg.CreateMap<Data.Daughter, Models.Daughter>().ForMember(m => m.Parent, opt => opt.Ignore()).ReverseMap(); 
} 

나는 각각 아들과 딸의 부모를 무시하고 부모의 AfterMap의 각 아들과 딸에게 부모를 매핑하고있다. 이것이 내가 그것을 설정하기 위해 따르고있는 예에서 어떻게 이루어 졌는지입니다.

나는 부모를 뽑을 수 있고 아들 딸들의 컬렉션이 돌아와서 내가 사용할 수 있고 그 모든 것이 내가 원하는 것일 수있다. 나는 아들이나 딸을 낳을 수 있고 부모님은 돌아 오실 수 있습니다.

내가 겪고있는 문제는 무언가를 되돌리고 다시 저장하는 것입니다. 새로운 부모를 만들고 아들이나 딸들을 추가 할 때 나는 그 새로운 부모를 살릴 수 있고 아들 딸들을 구원 할 수 있습니다.하지만 부모님, 아들, 딸을 데이터베이스에서 끌어 와서 뭔가를 바꾸면 그것을 다시 보내려고하면 Model.Parent => Data.Parent의 매핑에서 Stack Overflow 예외가 발생하여 실패합니다.

데이터를 가져올 때 Data.Parent => Models.Parent ... 매핑이 잘되지 않습니다. 그렇다면 왜 실패입니까?

데이터 클래스는 EF로 생성되며 모델 클래스는 다른 레이어에 배치 된 데이터 클래스의 복사본입니다. 당신이 데이터에 대해했던 것과 같은 방식으로 -

답변

1
당신은 역지도에 Parent 멤버를 구성해야

(> 데이터 모델) -> 모델 매핑 :

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<Data.Parent, Models.Parent>().AfterMap((src, dest) => 
    { 
     foreach (var i in dest.Sons) 
      i.Parent = dest; 
     foreach (var i in dest.Daughters) 
      i.Parent = dest; 
    }) 
    .ReverseMap().AfterMap((src, dest) => 
    { 
     foreach (var i in dest.Sons) 
      i.Parent = dest; 
     foreach (var i in dest.Daughters) 
      i.Parent = dest; 
    }); 

    cfg.CreateMap<Data.Son, Models.Son>() 
     .ForMember(m => m.Parent, opt => opt.Ignore()) 
    .ReverseMap() 
     .ForMember(m => m.Parent, opt => opt.Ignore()); 

    cfg.CreateMap<Data.Daughter, Models.Daughter>() 
     .ForMember(m => m.Parent, opt => opt.Ignore()) 
    .ReverseMap() 
     .ForMember(m => m.Parent, opt => opt.Ignore()); 
}); 
+0

오, 당신이 바로 농담이지? –

+0

내 말은, 그게 쉽지 않다는 농담이야. 그것은 의미가 있지만, 나는 단지'ReverseMap()'이 역으로 같은 것을 한 것이라고 생각했습니다. –

+0

W/O 수동으로 수행하면 원래 게시물에서와 동일한 'StackOverflowException'가 표시됩니다. 코드는 같지만 실제로'ReverseMap' 이후에'src'와'dest'가 교환됩니다. –

관련 문제