2016-12-23 22 views
1

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; 
} 

これはクエリによって返されます。 (申し訳ありませんが、いくつかのものを検閲するのに必要。)

nested objects

+0

Newtonsoft.Jsonを使用していますか? –

+0

@ YuriTceretian私はそうしていますが、現在は.NET Coreに統合されています。例えば、私は 'return Ok(model);'を使ってコントローラから返ってきます。私は 'JsonConvert'で手作業でシリアル化しているわけではありません。 – vaindil

+0

これまで私はこれまでにヒットしたことが分かりました。情報を崩壊させてキャップしたDTOモデルを作成し、他のシステムがデータベース/ EFフォーマットに比べて簡単に使用できるようにしました。 – ps2goat

答えて

5

これは、関連する.NETのコアではありません! JSON.NETはシリアル化を行っています。それは循環参照がモデルを形成し、モデルの2つの異なるペアを持って削除するオプションです

はちょうど Startup

services.AddMvc() 
    .AddJsonOptions(options => 
    { 
     options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    })); 

編集で設定中にこれを追加し、グローバルに無効にするにはカテゴリや興味を表示するかどうかによって異なります。

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 class InterestModel 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public InterestCategoryModel InterestCategory { get; set; } 

    public class InterestCategoryModel 
    { 
     public long Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

モデルのそれぞれが、それは子オブジェクトですが、彼らは彼らのバック参照が削除されているので、直列化復元時に何の無限の参照はないだろう?のための入れ子になったクラスを持っていることに注意してください

+0

最初のメッセージで、著者は彼がそのオプションを設定したと述べました。しかし編集後、それは消えた。 –

+0

私は元の質問でそれを持っていましたが、明確にするために編集しました。私はそれがまだあいまいであることを理解しています、私はそれをさらに編集しました。ごめんなさい。 :/独自のクラスの代わりにJSON.NETでカスタムマッピングを配置する方法はありますか?助けてくれますか? – vaindil

+0

@vaindil:上記のようにモデル内の自己参照を削除することはできますか? – Tseng

関連する問題