2017-05-16 230 views
1

我有一個對象,我們稱之爲父對象,其中包含兒子和女兒的集合。Automapper將對象與集合映射

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中的每個兒子和女兒。這是我在一個示例中完成的工作,我正在設置它。

我可以拉一個家長,兒子和女兒的收藏品回來了,我可以使用它們,所有這一切,那就是我想要的。我可以拉一個兒子或女兒,父母回來。

我遇到的一個問題是將某些東西拉回來,然後將其返回以保存它。當我創建一個新的父母,然後添加兒子或女兒時,我可以保存這個新的父母,並且保存兒子和女兒以及所有的東西,但是當我從數據庫中拉回父母,兒子或女兒時,嘗試將其發回,它會在Models.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

無手動操作我得到了與原始帖子中一樣的'StackOverflowException'。代碼看起來相同,但實際上在'ReverseMap'之後的部分中,交換了'src'和'dest'。 –