2

System.StackOverflowException以前は AutoMapper 4 で動作していた AutoMapper 5 で何かをマップしようとすると、問題が発生します。

少しグーグルで調べたところ、循環参照が原因であることがわかりました。

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)したところ、再び機能するようになりました。

ただし、実際の問題と、行を追加して何をしたかはわかりません:)

私の質問:

  • Category/CategoryDto に関する「循環参照」とは何ですか?
  • 正確には何.MaxDepth()ですか?サンプルで 3 が使用されているのはなぜですか?
  • .PreserveReferences()のためですか?
4

1 に答える 1

4

PreserveReferencesこれにより、マップは慣れ親しんだように動作AutoMapper4します。マップされているものをAutoMapper追跡し、オーバーフローが発生するのを防ぎます。

AutoMapperもう 1 つのオプションは、横断したい深さを設定することです。深さを設定すると、自己参照モデルが指定された回数マップされます。

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

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

それ自体を参照するクラス、プロパティは、Childこのオブジェクトを何度もネストできることを意味します。

于 2016-11-17T11:09:27.237 に答える