2017-12-15 1 views
1

ich Rückkehr Daten über Web-api mit ..Wie wird nur die übergeordnete Tabelle mit Entity Framework eingebunden?

FMSEntities db = new FMSEntities(); 
db.Voucher_BankReceipt.Include(x => x.Status) 

Wo Status übergeordnete Tabelle ist, die, wie unten in HashSets gegeben anderen Kindern verweist ..

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

Auf die übergeordnete Tabelle Status einschließlich, Es enthält alle referenzierten hashset-Objekte. Wie kann ich das erneute Laden von Voucher_BankReceipt & anderen hashset json vermeiden?

+0

Wie üblich: Lazy Loading ausschalten. Aber die Option in der Antwort ist mehr vorzuziehen. –

+0

Hat meine Antwort Ihre Frage erfüllt? Wenn ja, überlege es dir bitte. –

Antwort

3

Die allgemeine Regel besteht darin, Entity Framework-Objekte niemals an den JSON-Serializer des Web-API zu senden, und Sie haben gerade herausgefunden, warum.

Stattdessen müssen Sie genau aus EF nehmen, was Sie benötigen oder was Ihr API-Aufrufer benötigt. Es gibt keine Möglichkeit, dass der Serializer das für Sie weiß. Aufgrund seiner Beschaffenheit wird es fast immer zu viel greifen, möglicherweise sogar mit Schleiffehlern als Folge.

Die Lösung besteht darin, Objekte/ViewModels zu erstellen, die die Teile des EF Objects, die der Aufrufer benötigt, zu kopieren, diese aus den EF Objects zu füllen und sie dann zurückzugeben.

Eine schnelle und unsaubere Weise ist anonym Objekte zu verwenden, zum Beispiel:

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

Ein guter Regel-of-Daumen ist nur einfache Eigenschaften (Anzahl, bool, string, Datetime) von zuweisen die EF-Objekte zu den ViewModel-Elementen. Sobald Sie auf eine EF-Objekteigenschaft stoßen, bei der es sich um ein weiteres EF-Objekt (oder eine Sammlung von EF-Objekten) handelt, müssen Sie diese ebenfalls in "einfache" Objekte übersetzen, die nicht mit EF verknüpft sind.

Am anderen Ende des Spektrums gibt es Bibliotheken wie AutoMapper. Wenn Sie entscheiden, dass Sie tatsächliche ViewModel-Klassen benötigen, hilft Ihnen AutoMapper, die EF-Objekte sehr strukturiert mit diesen ViewModels zu verknüpfen.

+0

Schleifenfehler = Rekursion. –

Verwandte Themen