4

私はEF 4.1 Database Firstアプローチを使用しています。T4テンプレートは、別のアセンブリでPOCOクラスを生成しています。私は、データを取得するためのリポジトリと、UIとの通信に使用されるサービス層を持っています。EF 4.1 + MVC + JSON循環参照例外のための最善の解決策はありますか?

私はドロップダウンをカスケード接続しようとしていました。 MVCとEF 4.1で新しくなったので、可能なソリューションについてはstackoverflowを検索しました。

これはサンプルのviewmodelクラスです:

public class MyViewModel 
{ 
public int CustomerId { get; set; } 
public string CustomerName { get; set; } 
public IEnumerable<Phone> Phones { get; set; } 
} 

私がこれまで読んだことが何、解決策は以下のとおりです。 参照性質上 System.Web.Script.Serialization

  1. 使用ScriptIgnoreAttribute - 私は本当に しません私は System.Web私のPOCOプロジェクトへの参照を追加したくないので、これをしたい

  2. EF 4.1 DbContextで無効に遅延ロードは - 私はわからないんだけど、私が使用したいんでは徹底した私のプロジェクト

  3. 戻る匿名型を含める - 私のプロジェクトは、大なるとき、私は、このアプローチに問題があるのだろうか?

  4. ViewModelを使用する - 1台以上の電話機を持つことができるカスタマーがいるとします。最初のドロップダウンリストでCustomerを選択し、2番目のドロップダウンですべての電話機を表示します。
    これは私のPhonesオブジェクトに対して循環例外を生成しませんか?それとも、私のPhoneオブジェクトのための特別なクラスを作るだろうか?それは不必要なコードのように思える。

  5. AutoMapperを使用する - AutoMapperの使用経験がないため、どれほど複雑かわかりません。

あなたはどちらを投票しますか?なぜですか?

答えて

5

ドメインモデルとビューに送信するビューモデルをマップするには、ビューモデルとAutoMapperを使用します。これにより、ビューに送信されるプロパティを完全に制御できるため、サーバーとクライアント間で送信されるデータ量が削減されます。また、ビューモデルを使用しているため、コードはドメインエンティティの変更に対してより復元力があります。それらを変更すると、マッピングレイヤーだけが影響を受けるため、コントローラやビューに触れる必要はありません。

私のアドバイスは、AutoMapperをダウンロードし、ドキュメントを読んでから使用することです。それは人生を変える人です、私を信じてください。

+0

サンプルクラスをビューモデルとして使用できますか? Phoneエンティティ(EF 4.1から生成されたPOCO)に循環参照のシリアル化の問題がありますか。 –

+0

@MarkoTošićさん、あなたのドメインモデル(電話)への参照が含まれているので、ビューモデルではありません。ハイブリッドなので、このPhoneクラス自体が他のドメインモデルへの参照を持っていれば、すぐに同じ問題が発生します。これをしないでください。純粋なビューモデルクラスを定義します。 –

+0

私はPhone ModelオブジェクトクラスのDTO PhoneDTOクラスを定義してから、私のViewModelにIEnumerable というプロパティを設定する必要がありますか? 私は「より簡単な」解決策を見つけようとしていましたが、結局のところ、これは正しいアプローチのようです。 P.P.私は投票のために十分な担当者を持っていません。 –

関連する問題