2011-10-25 2 views
4

Automapper多対多のStackOverflowExceptionが

Mapper.CreateMap<Parent, ParentViewModel>() 
       .ForMember(x => x.Children, o => o.MapFrom(x => x.Children.ConvertToChildrenViewModel())); 

Mapper.CreateMap<Children, ChildrenViewModel>() 
       .ForMember(x => x.Parents, o => o.MapFrom(x => x.Parents.ConvertToParentViewModel())); 

これは明らかに、ここで無限ループが起こっている理由を私は理解しています。オートマトンでこれを動作させるにはどうすればいいですか?私は両親に、彼らの子供とその子供たちが両親について知ることを知る必要があります。 Parents.Childrenプロパティを含まないChildren.Parentsの別のViewModelを作成する必要がありますか?

拡張メソッドの例は、同様に子供たちのために:

public static IList<ParentViewModel> ConvertToParentViewModel(this IEnumerable<Parent> parents) 
     { 
      return Mapper.Map<IList<ParentViewModel>>(parents); 
     } 
+0

'ConvertToChildrenViewModel'と' ConvertToParentViewModel'は実際にどのような方法ですか?コード – hazzik

答えて

3

AutoMapperはマッピングされているものを追跡するが、唯一つのマップの呼び出し、Mapper.Mapにない複数の外部コールのコンテキストではありません。

どちらのマッピング構成でも、ForMemberピースは必要ありません。これを削除すると、AutoMapperは親子関係を走査し、既にマップされているものを追跡します。

+0

もう一度ジミーに助けてくれてありがとう! – spaceagestereo

7

あなたは再帰的なマッピングのために使用することができますMaxDepth設定があります。私は以前はそれを使用したことはありませんが、それはあなたを助けるかもしれません。あなたは型マッピングの上に置きます:

Mapper.CreateMap(...).MaxDepth(5) 
+0

を表示してください。これはうまくいかなかったようですが、他の提案はありますか? – spaceagestereo

+0

私はForMemberが必要ないように見えます。私たちがコレクションのためにそこに持っていた理由は分かりませんが、今はForMemberなしで動作しています。 – spaceagestereo