2017-12-15 10 views
1

私は、親テーブルのステータスを含むで..Entity Frameworkを使用して親テーブルのみを含める方法

ステータスは以下hashsetsに与えられたように、他の子供たちを参照する親テーブルである
FMSEntities db = new FMSEntities(); 
db.Voucher_BankReceipt.Include(x => x.Status) 

でウェブAPIを通じて

public Status() 
{ 
     this.Voucher_BankPayment = new HashSet<Voucher_BankPayment>(); 
     this.Voucher_BankReceipt = new HashSet<Voucher_BankReceipt>(); 
     this.Voucher_CashPayment = new HashSet<Voucher_CashPayment>(); 
     this.Voucher_CashReceipt = new HashSet<Voucher_CashReceipt>(); 
     this.Voucher_Journal = new HashSet<Voucher_Journal>(); 
     this.Voucher_Log = new HashSet<Voucher_Log>(); 
     this.Voucher_Workflow = new HashSet<Voucher_Workflow>(); 
} 

をデータを返しますよ参照されているすべてのハッシュセットオブジェクトが含まれています。 Voucher_BankReceipt &他のハッシュセットjsonのリロードを避けるにはどうしたらいいですか?

+0

通常通り:遅延ロードをオフにします。しかし、答えのオプションがより好ましい。 –

+0

私の答えはあなたの質問を満足させましたか?もしそうなら、それを受け入れることを検討してください。 –

答えて

3

一般的なルールは、Entity FrameworkオブジェクトをWeb API JSONシリアライザに絶対に送信することであり、その理由を知りました。

代わりに、必要なもの、またはAPI呼び出し側が必要とするものをEFから正確に取得する必要があります。シリアライザーがそれをあなたに知らせる方法はありません。その性質上、ほとんどの場合、ループのエラーが発生する可能性があります。

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

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

// Instead of "return EF_Product;" you can use this: 
return new 
{ 
    Product = new 
    { 
     Id = EF_Product.Id, 
     Name = EF_Product.Name 
    } 
}; 

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

スペクトルの反対側には、AutoMapperなどのライブラリがあります。実際のViewModelクラスが必要と判断した場合、AutoMapperはEFオブジェクトをそれらのViewModelに非常に構造化された方法でマッピングするのに役立ちます。

+0

ループエラー=再帰。 –

関連する問題