2017-12-20 24 views
0

複雑なカスタムオブジェクトの配列をレスポンスで返すWebAPIサービスを開発しました。 フィールドの一部に多対多の関係があります。例えば:WebAPIの応答によって "System.OutOfMemoryException"が発生する

[Table("OEReferences", Schema = "public")] 
public class OEReference 
{ 

    [NotMapped] 
    public IList<IAReference> IAReferences{ get; set; } 

} 

[Table("IAReferences", Schema = "public")] 
public class IAReference 
{ 

    [NotMapped] 
    public IList<OEReference> OEReferences{ get; set; } 

} 

各OEReferenceオブジェクト等、同時に各IAReferenceオブジェクトはIAReferencesのその対応リストを(最初のものを含む)OEReferenceのリストを有し、IAReferencesのリストを有し、決して停止します。

ときどきメモリ不足例外が発生しています。これが理由ですか?どうすればそれを防ぐことができますか?

これは、〜50個のOEReferenceで壊れており、それぞれに2つのIAReferencesが含まれています。残りのフィールドは非常にシンプルです。 .NET 4.7.1でHttpClientクラスを使用します。

答えて

1

(組み込みのJSONシリアライザを使用して)Web APIから直接Entity Frameworkオブジェクトを返すようです。 JSONシリアライザが見つけることができるすべてをシリアル化しようとするため、一般的なルールは決してそれをすることではありません。しかし、あなたのような関係を持つEFオブジェクトでは、どこで停止するか分かりませんので、参照ループエラーやメモリ不足エラーにつながります。

代わりに、EFオブジェクトから、正確には、API呼び出し側に必要なものを正確に取得する必要があります。

解決策は、呼び出し側が必要とするEFオブジェクトの一部をコピーし、EFオブジェクトからのオブジェクトを塗りつぶして戻すオブジェクト/ ViewModelを作成することです。

汚い迅速アンド方法は、例えば、匿名オブジェクトを使用することである。

// Instead of "return EF_Item": 
return new 
{ 
    Item = new 
    { 
     Id = EF_Item.Id, 
     Description = EF_Item.Description, 
     Things = MapThings(EF_Item.Things) // helper function that you need to provide 
    } 
}; 

良い経験則のみから単純な性質(数、ブール、文字列、日時)を割り当てることですEFオブジェクトをViewModel項目に追加します。まだ別のEFオブジェクト(またはEFオブジェクトの集合)であるEFオブジェクトのプロパティに遭遇するとすぐに、それらをEFにリンクされていない「単純な」オブジェクトにも変換する必要があります。

もっと構造化されたアプローチは、ViewModelクラスを使用することです。また、AutoMapperなどのツールを使用することで、さらに構造化することができます(一度設定すると)いつでもどこでも必要な場所でマッピングが実行されます。

関連する問題