2016-07-19 9 views
0

ASP.NET Web APIを使用したJSONシリアル化中にEntity Framework 6で循環参照されるのを避ける方法はありますか?EF6:循環参照を回避するにはどうすればよいですか?

まず、Entity Framework 6のデータベースであるedmx(Entity Data Model)ファイルを生成しました。私はASP.NET Web APIを使ってAPIを構築しようとしています。私のコントローラで私のJSONオブジェクトを返そうとすると循環参照のために直列化の実行時例外が発生します。

実際にデータベースとエンティティを再確認すると、自分のエンティティの1つに、以前のエンティティのリストを含む別のエンティティがリストに含まれています。私は作者を含む書籍エンティティを持っており、各著者エンティティには書籍のリストが含まれているとしましょう。これは相対的なデータベースでは一般的ですが、JSONのシリアル化では解決できません(または.NETシリアライザでは解決できません)。

データベースを変更したくないのですが、間違ったリストをエンティティまたはedmxファイルに分割する準備ができました。私に何ができる?

を私はすでに新しいモデルやエンティティを作成し、マッピングツール(http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-SerまたはPluralsightのショーンWildermuthによってによって説明ソリューション)を使用して、で構成されて解決策を試してみました:私は試してみました何

このソリューションは、実際のソリューションよりも回避策のように聞こえます。 JSONシリアライザに循環参照を引き起こす原因、シリアル化できるものとシリアル化する必要があるもの、シリアル化できないものを正しく伝えるには、edmxファイルまたはEntity Frameworkに何かが存在するはずです。

+1

を仮想を削除し、そうすることができますするために、この重複としての質問この場合は、重複する回答にリンクしてください。すでに試したこと以外は何も見つかりませんでした。 –

答えて

1

ドメインモデルを直接シリアル化することは技術的には問題ありません。循環参照を避けるために、遅延ロードを使用することはできません。あなたは負荷を管理しなければなりません。フラグをそう

  1. を行う
  2. (コードの最初のアプローチで)、モデルの各コレクションの前に(データベースの最初のアプローチで)falseに設定遅延ロードの設定
+1

参照ループ処理を無視しようとしましたか? http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected –

1

ドメインモデルを直接シリアル化しようとしないでください。必要な形式でデータを返すビューモデルを作成します。ドメインモデルを使用してビューモデルを作成します。その他の情報はこちらWhy do we use ViewModels?

+1

私はこのアイデアを理解していますが、これは自分自身を繰り返さないというルールを尊重するものではありません。 –

+0

ビューモデルを作成すると、データのパブリックビューが定義されます。ドメインモデルは、チームと社内のステークホルダーがビジネス機能をどのように記述しているかを示します。パブリックビューをまったく同じに保ちながら、それらの内部構造をリファクタリングすることができます。 – Fran

+0

はい、いいえ... OOPの考え方は、あなたのモデル、ドメインモデルもビューモデルでなければならないということです。これは自分自身を繰り返さないというルールを尊重することが重要です。それ以外の場合は、ドメインモデルの各変数をビジネスモデルにマップする必要がありますが、データセットの時点で誰もがやったことと同じです。 –

関連する問題