[解決済み] 自己参照ループが検出された - WebApiからブラウザにデータを取得する
質問
私はEntity Frameworkを使用しており、ブラウザに親と子のデータを取得することに問題があります。以下は私のクラスです。
public class Question
{
public int QuestionId { get; set; }
public string Title { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
public string Text { get; set; }
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}
質問と回答のデータを返すために、以下のコードを使用しています。
public IList<Question> GetQuestions(int subTopicId, int questionStatusId)
{
var questions = _questionsRepository.GetAll()
.Where(a => a.SubTopicId == subTopicId &&
(questionStatusId == 99 ||
a.QuestionStatusId == questionStatusId))
.Include(a => a.Answers)
.ToList();
return questions;
}
C#側では、これは動作しているように見えますが、私は回答オブジェクトが質問に戻る参照を持っていることに気づきました。私がブラウザにデータを取得するためにWebAPIを使用するとき、私は次のメッセージを取得します。
ObjectContent`1' タイプは、コンテンツタイプ 'application/json; charset=utf-8' のレスポンスボディをシリアライズすることに失敗しました。
タイプ 'Models.Core.Question' を持つプロパティ 'question' に対して自己参照ループが検出されました。
これは、QuestionがAnswersを持ち、AnswersがQuestionに戻る参照を持っているためでしょうか?私が見てきたすべての場所は、子で親への参照を持つことを示唆しているので、私は何をすべきかわかりません。どなたか、この件に関するアドバイスをお願いします。
どのように解決するには?
<ブロッククオートこれは、質問には答えがあり、答えには質問への参照があるためですか? 質問に戻って参照する?
はい、シリアライズできません。
EDIT: Tallmarisの回答やOttOのコメントを見ると、よりシンプルでグローバルに設定できるようです。
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
古い回答です。
EFオブジェクトを投影する
Question
を独自の中間オブジェクトまたはDataTransferObjectに投影します。このDtoはその後、正常にシリアライズすることができます。
public class QuestionDto
{
public QuestionDto()
{
this.Answers = new List<Answer>();
}
public int QuestionId { get; set; }
...
...
public string Title { get; set; }
public List<Answer> Answers { get; set; }
}
みたいな感じ。
public IList<QuestionDto> GetQuestions(int subTopicId, int questionStatusId)
{
var questions = _questionsRepository.GetAll()
.Where(a => a.SubTopicId == subTopicId &&
(questionStatusId == 99 ||
a.QuestionStatusId == questionStatusId))
.Include(a => a.Answers)
.ToList();
var dto = questions.Select(x => new QuestionDto { Title = x.Title ... } );
return dto;
}
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み] 2つのリストを結合する
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] JSON.NET エラー タイプの自己参照ループが検出されました。
-
[解決済み] JSON.Netの自己参照ループが検出されました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] JSON.NET エラー タイプの自己参照ループが検出されました。