2016-09-01 3 views
1

これは重複した質問として表示される可能性があります。はい、私の質問に既に回答しているかもしれないの質問を確認しましたが、回答が見つかりませんでした。Automapper v5.1.1 - Circular references

他のほとんどの質問に関連するように、私の問題はお互いを参照するモデルに関連しています。私は子供のための別々のDTOオブジェクトを作成するために私のコードをリファクタリングするような、私が続けることができる他のアプローチをよく知っています。問題は、モデルとリファクタリングのかなりの割り当てが非常に煩わしいことです。

私は次のように述べてAutomapper v5.0 Upgrade Guide、読み:

enter image description here

私が試してみた - 例えばClientModel

var clientModelMap = CreateMap<Client, ClientModel>() 
    .ForMember(dest => dest.Id, source => source.MapFrom(x => x.ClientId)) 
    .ForMember(dest => dest.InvoicePayments, source => source.Ignore()); 

clientModelMap.MaxDepth(1); 
clientModelMap.PreserveReferences(); 

などProjectモデルで:

var projectModelMap = CreateMap<Project, ProjectModel>() 
    .ForMember(dest => dest.Client, source => source.Ignore()) 
    .ForMember(dest => dest.Id, source => source.MapFrom(x => x.ProjectId)) 
    .ForMember(dest => dest.ClientName, source => source.MapFrom(x => x.Client.ClientName)) 
    .ForMember(dest => dest.ClientTariff, source => source.MapFrom(x => x.Client.Tariff)) 
    ; 
projectModelMap.MaxDepth(1); 
projectModelMap.PreserveReferences(); 
次のように

構造は次のとおりです。

  • クライアント
    • プロジェクト(各クライアントは、多くのプロジェクトを持っている)
      • リソース(各プロジェクトは、プロジェクトマネージャーを持っている)
        • プロジェクトが(関連付けられています彼/彼女が取り組んでいる1つ以上のプロジェクト)
        • クライアント(クライアントに関連付けられている/ sのマネージャー)

しかし、これは効果がありません、と私はまだStackOverflowExceptionを受けます。何が欠けているのか、間違っているのですか?

これは方法がない場合、私は提案のために開いています。

多くの感謝!

+0

[MVCE](http://stackoverflow.com/help/mcve)をセットアップできますか? – stuartd

+0

@stuartd - 応答に感謝します。私は実際に私の問題を発見した。 v5.0ガイドで提供されているコード例は正しく機能します。私はそれをモデル階層でさらに実装しませんでした。 –

+0

'MaxDepth(x)'の理解を深めるために、基本的に次のように述べています。マップされる指定されたモデルのマッピングプロファイルを入力するたびに、maxに達しているかどうかがチェックされます。したがって 'Client'が' Project'と 'User'を参照するのが好きなら、それを2に設定します。これは正しいですか? –

答えて

0

(OPの代わりに掲示)

これは期待どおり機能しています。モデル階層の残りの部分でマッピングプロファイルを更新する必要がありました。