SPA mit ASP.NET Core und Angular

Datenzugriff kapseln

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Durch die Entwicklung gegen Schnittstellen kann die Implementierung zu einem späteren Punkt ausgetauscht werden. Ersetzen Sie über diesen Weg den Datenzugriff auf eine Datei durch den Zugriff über das Entity Framework Core auf eine SQL-Server-Datenbank.
07:40

Transkript

Zu meiner Anwendung habe ich einen Verweis auf das Entity Framework hinzugefügt und einen entsprechenden DbContext angelegt. Wenn ich nun allerdings einmal in meinen Controller hereinschaue, den ich bereits angelegt habe, nämlich den DishesController, dann sehe ich, dass hier der Datenzugriff über ein IDishRepository erfolgt. Dieses IDishRepository, das ist aktuell allerdings noch dazu konfiguriert, dass dateibasierte DishRepository zu nutzen, was wir im Ordner Repositories sehen. Und hier wird wie bereits gesagt auf eine Datei zugegriffen. Ich möchte jetzt ganz gerne ein neues Repository implementieren und dieses Repository in meinem Controller benutzen. Glücklicherweise muss ich im Controller selber gar nichts ändern, denn hier benutze ich bereits als Abstraktion ein IDishRepository. Alles, was Sie also machen müssen, ist für diese Schnittstelle eine neue Implementierung bereitstellen, die das Entity Framework nutzt, und diese Implementierung dann in der Methode ConfigureServices entsprechend konfigurieren. Der erste Schritt besteht also daraus, eine neue Klasse hinzuzufügen, die anschließend die Schnittstelle implementiert. Die Klasse, die nenne ich EfDishRepository und gebe an, dass sie das IDishRepository implementieren soll. Aktuell implementiert sie das noch nicht, deswegen wird hier ein Fehler angezeigt. Ich drücke also Strg+. und wähle den Punkt Schnittstelle implementieren aus. Um mit dem Entity Framework arbeiten zu können, benötige ich einen Entity Framework Context. Dieser Context ist in meiner Anwendung vom Typ VegiContext. Ich lege mir hier also einmal ein Feld an vom Typ VegiContext, nenne das Ganze db. Und erzeugen möchte ich das nicht selber in meinem Repository, Sondern ich möchte das von außen über die Pandancy Injection übergeben. Also lege ich einen Konstruktor an, der ein Objekt vom Typ VegiContext übergeben bekommt. Das nenne ich dann db und meinem Feld mit dem Namen _db weise ich dann dieses übergebene Objekt zu. Jetzt bin ich also bereit, um mein Repository auf Basis des Entity Framework zu implementieren. Als erstes werde ich mir die Methode CreateDish vornehmen, die eine neue Speise anlegen soll. Das Anlegen geht beim Entity Framework relativ einfach. Ich rufe db.Dishes auf und rufe an dem DbSet der Speisen die Methode Add auf und übergebe die zu speichernder Speise. Anschließend muss ich die Methode SaveChanges aufrufen. Die sorgt dafür, dass die Änderung auch in der Datenbank persistiert wird. Jetzt besagt der Vertrag dieser Methode, dass die ein Objekt vom Dish zurückgibt. Das macht auch durchaus Sinn, denn wenn ich eine Speise übergebe, dann hat die noch keine ID. Die wird in der Datenbank generiert und zwar im Laufe dieses SaveChanges-Vorgangs. Und anschließend steht die ID dann in diesem Objekt. Darum gebe ich an der Stelle hier einfach das ursprünglich übergebene Objekt zurück, was automatisch durch das Entity Framework um die ID angreichert wurde. Nach dem Anlegen in dem (unverständlich) Create, wo ich also einfach nur Add aufgerufen habe, werde ich jetzt Delete implementieren. Beim Löschen sieht es wie folgt aus. Ich muss den Datensatz zunächst einmal laden. Dafür kann ich am DbSet Dishes die Methode Find aufrufen. An Find übergebe ich den Primärschlüssel und jetzt enthalte ich entweder das gefundene Objekt oder null zurück. Im Fall, dass ich das Objekt gefunden habe, dass es also nicht null ist, in diesem Fall werde ich das gerade über den Kontext geladene Objekt wieder von dem DbSet Dishes entfernen. Dazu nutze ich die Methode Remove und übergebe die soeben geladene Speise. Auch hier muss ich daran denken, am Ende SaveChanges aufzurufen. Die Methode DeleteDish, die ist vom Typ void. Die gibt also nichts zurück. Dementsprechend muss ich hier auch nichts zurückgeben. Das Laden eines Datensatzes anhand seiner ID, das ist relativ simpel. Das haben wir hier oben nämlich schon einmal gemacht. Alles, was ich mache, ist also, dass ich sage return _db.Dishes.Find(id). Und dann wird hier abhängig davon, ob es den Datensatz gibt oder nicht, entweder ein initialisiertes Dish-Objekt zurückgegeben oder eben nein. Alle Dishes zurückgeben, das ist auch nicht sonderlich schwer. Dazu gebe ich einfach den DbSet an der Stelle hier zurück. Also einmal return_db.Dishes, denn der DbSet, der implementiert auch die Schnittstelle IEnumerable. Etwas aufwendiger wird die Situation beim Ändern eines Datensatzes. Schritt Nummer 1 ist, ich muss die entsprechende Entität laden. Also var dishToUpdate = db.DishesFind und dann dish.Id. Jetzt habe ich also eine Entität geladen über den Kontext, und die Arbeitsweise von Entity Framework ist jetzt folgende: Jede Eigenschaft dieser Entität, die ich jetzt ändern werde, wird bei einem SaveChanges durch ein Update Statement in die Datenbank geschrieben. Was heißt das? Ich gehe also hin und weise einmal sämtliche Eigenschaften wie zum Beispiel Name des dishToUpdates. Dem weise ich die Werte aus der übergebenen Speise zu. Das mache ich nicht nur für den Namen. Das mache ich auch für die Description zum Beispiel. Außerdem muss ich das natürlich auch für den Preis erledigen und für die CategoryId. So, nachdem das jetzt erfolgt ist, kann ich nun an meinem Kontext SaveChanges aufrufen und kann dieses Dish, was ich zuvor aus der Datenbank geladen habe, diese Speise, die kann ich jetzt zurückgeben. Was das Entity Framework nun macht, ist Folgendes: Stellen Sie sich vor, ich habe hier lediglich den Namen geändert. Dann passiert Folgendes: Bei der Zuweisung ändert sich natürlich auch nur hier der Name, und das Entity Framework wird in dem Update Statement nur den Namen aktualisieren und nicht alle anderen Spalten auch. So, nachdem ich mein Entity Framework basiertes Repository als vollständig implementiert habe, muss ich es nur noch registrieren. Dazu wechsle ich in die Klasse Startup und in der Methode ConfigureServices, in der ich momentan für das IDishRepository das FileDishRepository konfiguriert habe. Muss ich nun das FileDishRepository entfernen und stattdessen das Entity Framework basierte DishRepository wählen. Das wird jetzt dazu führen, dass bei einem Aufruf meines DishesController diese nun automatisch über das Entity Framework auf die Datenbank zugreift.

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
Ihr(e) Trainer:
Erscheinungsdatum:25.09.2017
Laufzeit:5 Std. 21 min (36 Videos)

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!