2016-11-17 18 views
2

私はそれがCircular referencesによって引き起こされることが判明周りのビットをグーグル後AutoMapper 4.はAutoMapper 5への移行 - 循環参照

で以前働いていたAutoMapper 5で何かの地図しようとしたとき、私はSystem.StackOverflowExceptionを抱えています。

AutoMapperのドキュメントは言う:以前

、AutoMapperはマッピングされたものの 追跡することにより、循環参照を処理し、すべてのマッピングに、かどうかを確認するために、ソース/デスティネーションオブジェクトのローカル ハッシュテーブルをチェックすることができますアイテムは既に にマップされています。このトラッキングは非常に高価で、循環マップの動作にPreserveReferencesを使用して オプトインする必要があります。 また、あなたがMAXDEPTH設定できます

// Self-referential mapping 
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3); 

// Circular references between users and groups 
cfg.CreateMap<User, UserDto>().PreserveReferences(); 

をだから私は私のコードに.MaxDepth(3)を追加し、それが再び機能するようになりました。

しかし、私はどのような本当の問題があると私は行を追加していたがundertandません:)

私の質問:

  • カテゴリ/ CategoryDtoの点で「循環参照」を意味は何?
  • 正確には何ですか.MaxDepth()?サンプルでなぜ3が使用されますか?
  • .PreserveReferences()とは何ですか?

答えて

3

PreserveReferencesこれまでのようにマップがAutoMapper4のように動作します。 AutoMapperはマップされているものを追跡し、オーバーフローを引き起こさないようにします。

もう1つの方法は、AutoMapperが通過する深度を設定することです。深度を設定すると、自己参照モデルを指定した回数だけマップします。

循環参照のようなクラスのようになります。

public class Category 
{ 
    public int Id {get;set;} 
    public Category Child {get;set;} 
    public string Value {get;set;} 
} 

自体を参照するクラス、プロパティChildはあなたが巣このオブジェクトを何回もできることを意味します。

+0

深度を1に設定しました。まだスタックオーバーフロー...!今のような構成が私たちの話を聞いているような感じです... –