EDIT:私はもともとこの問題をJSONのシリアライゼーションに問題があると言いました。この問題は、私のカスタムクラスを使用して返されたモデルに基底クラスから変換するときに実際に発生します。私は混乱のためにお詫び申し上げます。 :.NETコアで無限にネストされたオブジェクトを変換する
私は.NET Core 1.1.0、EF Core 1.1.0を使用しています。私は興味を持っており、自分のDBからそのカテゴリを取得したいと考えています。問題は、返されたカテゴリには、1つの親カテゴリがあり、1つの関心のあるコレクションなどがある、1つの関心のあるコレクションがあるということです。これをベースクラスから返品モデルに変換しようとすると、スタックのオーバーフローはオブジェクトの無限ループを変換しようとしているためです。この問題を回避する唯一の方法は、カテゴリをシリアル化する前にそのコレクションをnullに設定することです。
興味/カテゴリは例です。私が照会するすべてのエンティティ。一部はと非常に mes syをループと関連付けて、関連するプロパティを投稿/コメントなどのnullに設定します。
これに対処する最善の方法は何ですか?今、私は基本クラスと返されたモデルの間で変換するために書いたカスタムマッピングを使用していますが、他のツールを使用することは可能です。 (私は私のカスタムマッピングは、スタックオーバーフローの理由を知っている、しかし確実にモデル化するために、基本クラスから突出する前に、ヌルにすべてを設定するよりも、これを処理するより優雅な方法がなければならない。)
クラス:
public class InterestCategory
{
public long Id { get; set; }
public string Name { get; set; }
public ICollection<Interest> Interests { get; set; }
}
public class Interest
{
public long Id { get; set; }
public string Name { get; set; }
public long InterestCategoryId { get; set; }
public InterestCategory InterestCategory { get; set; }
}
を
モデル:
public class InterestCategoryModel
{
public long Id { get; set; }
public string Name { get; set; }
public List<InterestModel> Interests { get; set; }
}
public class InterestModel
{
public long Id { get; set; }
public string Name { get; set; }
public InterestCategoryModel InterestCategory { get; set; }
public long? InterestCategoryId { get; set; }
}
マッピング機能:
public static InterestCategoryModel ToModel(this InterestCategory category)
{
var m = new InterestCategoryModel
{
Name = category.Name,
Description = category.Description
};
if (category.Interests != null)
m.Interests = category.Interests.Select(i => i.ToModel()).ToList();
return m;
}
public static InterestModel ToModel(this Interest interest)
{
var m = new InterestModel
{
Name = interest.Name,
Description = interest.Description
};
if (interest.InterestCategory != null)
m.InterestCategory = interest.InterestCategory.ToModel();
return m;
}
これはクエリによって返されます。 (申し訳ありませんが、いくつかのものを検閲するのに必要。)
Newtonsoft.Jsonを使用していますか? –
@ YuriTceretian私はそうしていますが、現在は.NET Coreに統合されています。例えば、私は 'return Ok(model);'を使ってコントローラから返ってきます。私は 'JsonConvert'で手作業でシリアル化しているわけではありません。 – vaindil
これまで私はこれまでにヒットしたことが分かりました。情報を崩壊させてキャップしたDTOモデルを作成し、他のシステムがデータベース/ EFフォーマットに比べて簡単に使用できるようにしました。 – ps2goat