SPA mit ASP.NET Core und Angular

Daten hierarchisch zurückgeben

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Wenn Sie in Ihrer Anwendung hierarchische Daten haben, die Sie ausgeben möchten, müssen Sie die in diesem Film gezeigten Schritte durchführen.
06:20

Transkript

In meiner API möchte ich gerne, Speisen und Kategorien aus einer Datenbank zurückgeben. Den Datenbank-Kontext, den habe ich schon entsprechend vorbereitet, indem ich hier einen DbSet für Speisen und einen für Kategorien hinterlegt habe. Bisher hatte ich allerdings nur für Speisen auch einen Controller und eine Repository. Diese habe ich nun behoben, indem ich analog zu den Speisen auch die Kategorien implementiert habe. Dazu habe ich zunächst ein Repository geschrieben. Ich hatte also hier das IDishRepository, welches mir die typischen Grundmethoden definiert hat und analog dazu habe ich eine ICategoryRepository- Schnittstelle definiert, die mehr für Kategorien die Grundoperationen definiert. Implementiert habe ich das Ganze in dem EfCategoryRepository, indem ich hier also die entsprechenden Methoden zum Anlegen, zum Löschen, zum Laden und zum Verändern von Kategorien habe. Der Aufruf, der erfolgt in einem Controller, nämlich im Categories Controller. Und auch dieser Controller, der arbeitet ganz ähnlich wie mein bestehender Dish-Controller. Ich habe hier also Methoden zum Lesen, zum Ändern, zum Hinzufügen und zum Löschen, die alle jeweils das Repository nutzen. Die Verbindung zwischen der Schnittstelle und dem konkreten Repository, die habe ich in der Klasse Startup und zwar dort in der Methode ConfigureServices hinterlegt. Hier habe ich also definiert, was für ein ICategoryRepository, ein EfCategoryRepository genutzt werden soll. Wenn ich das Ganze jetzt starte, dann sehe ich zwar, dass es Grundlegend funktioniert, aber vielleicht nicht ganz den erwünschten Effekt hat. Was ich damit meine, zeige ich Ihnen am besten direkt im Postman. Hier führe ich also eine Anfrage gegen die API aus. Jetzt sehe ich hier zum Beispiel ich habe eine Kategorie 1, das sind die Salate, ich habe eine Kategorie 2, das sind die Suppen, ich habe eine Kategorie 3, Tapas, außerdem habe ich Hauptgerichte und so weiter. Was hier doch bei jeder Kategorie fällt, das sind die Speisen. Schön wäre es natürlich, wenn ich beim Abrufen einer Kategorie auch die zugehörigen Speisen laden könnte. Dass diese Speisen fehlen, das hat einen ganz einfachen Grund, das Entity Framework Core lädt Daten nicht mehr automatisch bei Bedarf nach, bedeutet es gibt kein automatisches Lazy Loading, zumindest nicht in der Version 1. Wenn wir also zusammen mit den Kategorien auch gleichzeitig Speisen laden möchten, dann muss ich in das CategoryRepository gehen und in der Methode GetCategories, über den Befehl Include angeben, dass ich ganz gerne auch noch die Speisen mit laden möchte, indem ich hier sage, x= x.Dishes. Das hier, das ist eine Erweiterungsmethode, da müssen wir den Namensraum Microsoft Entity Framework Core importieren und anschließend funktioniert auch diese Erweiterungsmethode. Jetzt liegt die Vermutung nahe, dass ich jetzt bereits die Speisen über die API hierarchisch anhand der Kategorie abrufen kann, aber wir werden gleich sehen, dass das nicht funktioniert. Und da das ein so häufiger Fehler ist, möchte ich Ihnen jetzt kurz zeigen, wie der Fehler aussieht und was Sie dagegen unternehmen können. Ich gehe also zurück in den Postman und führe erneut einen Aufruf auf den Kategorie-Controller aus. Und dieses Mal erhalte ich gar keine Rückmeldung mehr, und das liegt daran, dass meine Anwendung nicht mehr in der Lage ist, meine Anfrage zu bearbeiten, ich habe nämlich eine Exception bekommen. Und diese Exception, die habe ich bekommen, wenn wir hier mal ein wenig reinschauen, in die Ausgabe, dann sehen wir, dass wir hier einen sich selbst referenzierenden Loop haben und zwar für die Eigenschaft Category. Was ist hier das Problem? Das Problem ist folgendes, eine Kategorie hat eine Liste von Gerichten, ein Gericht hat wiederum eine Kategorie. Diese Kategorie hat dann wiederum Richter, und wenn wir so immer weiter serialisieren, dann drehen wir uns irgendwann komplett im Kreis. Was können wir dagegen tun? Im Endeffekt wollen wir eigentlich nur die erste Hierarchiestufe und diese Schleifen, die brauchen wir gar nicht. Und ich kann jetzt hier bei der Konfiguration des MVC-Frameworks mitteilen, dass ich bei der json-Serialisierung bitte keine Schleifen mit serialisieren möchte. Dazu rufe ich hinter AddMvc einfach noch .AddJsonOptions auf und hier wichtig, hier gibt´s kein Semikolon hinter, und die JsonOptions, die ich übergebe, die sind wie folgt, ich sage hier, dass ich an den Serializer Settings als ReferenceLoopHandling auf die Option ReferenceLoopHandling.Ignore stellen möchte. Und das führt dann dazu, dass eben solche Schleifen erkannt werden, dass nicht mehr versucht wird zu serialisieren. Gucken wir uns die Ausgabe einmal schnell im Postman an. Und hier haben wir jetzt die erwartete Ausgabe. Für meine Kategorie habe ich die entsprechenden Speisen, was allerdings fehlt, ist die Serialisierung der entsprechenden Kategorie an der Speise, ich habe hier nur noch die CategorieID. Das reicht mir allerdings vollkommen aus, so kann ich später in meiner Client-Anwendung wunderbar alle Kategorien auslesen und zu den Kategorien dann auch die Speisen ausgeben. Wenn Sie also in Ihrer Anwendung auch hierarchische Daten haben, die Sie ausgeben möchten, dann müssen Sie folgende Schritte durchführen. Schritt Nummer 1 ist in Ihrer Datenzugriffsebene, müssen Sie über Erweiterungsmöglichkeit Include genau angeben, welche abhängigen Daten Sie mit laden möchten. Es gibt also kein impliziertes LazyLoad, wie es bei älteren Entity Framework Versionen gab. Wenn Sie das gemacht haben, dann werden Sie allerdings beim Serialisieren in einen Fehler laufen, nämlich einen Fehler, weil Sie jetzt in einer Schleife serialisieren. Und diesen Fehler, den können Sie beheben, indem Sie in der Konfiguration für den MVC-Service die JsonOptionen SerializerSettings.ReferenceLoopHandling auf Ignore setzen.

SPA mit ASP.NET Core und Angular

Lernen Sie die Bestandteile von modernen Webanwendungen kennen und nutzen.

5 Std. 21 min (36 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Exklusiv für Abo-Kunden
Erscheinungsdatum:25.09.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!