Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SPA mit ASP.NET Core und Angular

Datenbank initial befüllen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Während der Anwendung von Entwicklungen macht es häufig Sinn, Ihre Anwendung mit bestehenden Testdaten zu testen. Wenn Sie das Entity Framework nutzen, können Sie solche Daten sehr schnell in Ihre Datenbank bekommen.
12:17

Transkript

Während der Entwicklung von Anwendungen macht es häufig Sinn, wenn wir mit bestehenden Testdaten unsere Anwendung testen können. Wenn wir das Entity Framework nutzen, dann können wir solche Testdaten sehr schnell in unserer Datenbank bekommen. Ich habe hier in meinem Projekt bereits das Entity Framework hinzugefügt, habe einen Kontext, der heißt VegiContext und der definiert zwei DbSets: Dishes und Categories. Für beide DbSets habe ich bereits Testdaten in der Form von JSON-Dateien. Der Aufbau ist wie folgt: In Datei dishes.json befinden sich Speisen. Diese Speisen, die haben eine ID, einen Namen, eine Beschreibung, ein Preis und eine KategorieID. Die KategorieID, die passt zu den IDs, die in der Datei categories.json steht, denn hier haben wir für jede Kategorie einen Eintrag, und diese Einträge, die haben jeweils eine ID, einen Namen und eine Beschreibung. Wenn ich nun also diese Daten initial in die Datenbank hereinbekommen möchte, dann geschieht das am einfachsten, indem ich mir eine neue Klasse anlege und diese Klasse, die nenne ich jetzt DBInitializer. Der Name ist nicht wirklich wichtig. Das ist also keine Konvention, an der ich mich halten muss, sondern es geht mir wirklich darum, dass ich einen sinnvollen Namen an der Aufgabe, der diese Klasse übernimmt, vergebe. In dieser Klasse werde ich nun eine Methode implementieren. Diese Methode, die ist statisch. Ich kann sie also aufrufen, um zuvor ein Objekt erzeugen zu müssen. Und die gibt nichts zurück. Die nenne ich Initialize, und die benötigt zwei Dinge. Die benötigt den DbContext, um Daten darüber eintragen zu können, und dieser DbContext, der befindet sich im Namensraum ElVegetarianoFurio.Models. Das nennen wir dann hier db, und ich muss die Dateien auslesen, und dafür brauche ich Zugriff auf meine Umgebung und das erhalte ich über ein Objekt vom Typ IHostingEnvironment Und das befindet sich im Namensraum Microsoft.AspNetCore.Hosting. Dieses Objekt, das nenne ich env. Und jetzt kann ich anfangen meine Methode in Initialize zu implementieren. Das erste, was ich mache, ist, ich rufe an meinem DbContext an der Eigenschaft Database die Methode EnsureCreated auf. Diese Methode macht Folgendes: die geht anhand der Verbindungszeichen, folgehin schaut, ob es die Datenbank bereits gibt, und wenn nicht, dann wird die für mich automatisch angelegt. Fals es in der Datenbank bereits Kategorien gibt oder falls es in der Datenbank bereits Speisen gibt, dann möchte ich meinen Initializer verlassen. Dann ist er offensichtlich vongelaufen. Also, gibt es Kategorien oder gibt es Speisen, dann werde ich hier einfach herausspringen. Ansonsten hole ich mir den Pfad zu meinen JSON-Dateien. Und dazu nutze ich aus der Klasse Path im Namensraum System.IO die Startmethode Combine und füge zusammen den ContentRootPath, den ich über das env.Objekt erhalte. Das ist also der Pfad, in dem meine Anwendung später laufen wird. Und diesen Pfad füge ich zusammen mit dem Pfad data. Dadurch lande ich in diesem Ordner hier. Im nächsten Schritt muss ich jetzt beide Dateien lesen. Das geht relativ simpel. Ich sage einmal var dishesJson = FileReadAllText. Mit der Methode ann ich also den gesamten Inhalt einer Datei in einem String lesen. Und das Pfad übergebe ich dem eben definierten Pfad plus den Dateinamen, also dishes.json. Das Ganze werde ich jetzt einmal kopieren und genauso für die Kategorien vornehmen. Ich benenne so die Variablen nur schnell um in categories.json. und muss hier natürlich auch Categories als Dateinamen annehmen. So, jetzt habe ich zwar den Inhalt gelesen, aber ich muss ihn auch deserialisieren, um etwas damit anfangen zu können. Deserialisieren, das mache ich über Json.Net, indem ich einmal die Speisen deserialisiere. Dazu nutze ich an der Klasse JsonConvert aus dem Namensraum NewtonsoftJson, die statische Methode DeserializeObject und zwar möchte ich hier ein Objekt vom Typ List of Dish deserialisieren anhand des dishesJson. Und das Gleiche mache ich dann auch einmal für die Kategorien. Natürlich muss das dann hier Categories heißen. Und hier ist das vom Typ Categorie. Ich will auch das categoriesJson hier übernehmen. So, jetzt habe ich die Daten aus meinen beiden JSON-Dateien deserialisiert. Der nächste Schritt ist, dass ich die jetzt in meinem DbContext speichere. Dazu gehe ich durch alle Kategorien durch. Hier habe ich übrigens einen Fehler drin, categories. So sieht das schon viel besser aus. Und ich gehe jetzt eben genau durch diese ganzen Kategorien. Ich sage also, für jede category in categories möchte ich folgendes ausführen: Ich möchte ganz gerne hier die Kategorie alle Dishes ermitteln, nämlich eine weitere foreach ... durchgehe, der ich sage, foreach var dish in dishes und zwar alle Dishes, deren KategorieId, also alle Speisen, deren KategorieId der Id der aktuellen Kategorie entspricht. Wenn ich jetzt diese Speisen alle ermittelt habe, die zu der aktuell durchlaufenden Kategorie gehören, dann mache ich folgendes: ich setze die Id dieser Speisen auf 0 und das mache ich, weil das Entity Framework gerne die IDs vergeben möchte. Und wenn die Ids vorgegeben sind, dann funktioniert das nicht. ... setze ich jetzt die Ids hier auf den Wert 0 und anschließend füge ich jede Speise der Auflistung Dishes in meiner Kategorie hinzu, indem ich über categorie.Dishes die Methode Add aufrufe und an Dish dann die Speise hinzufüge. Das hört jetzt dazu, dass ich eine Hierarchie aufbaue. Heißt für die Kategorie werden jetzt alle Speisen, und eine Speise gehört immer zu einer Kategorie, weil diesen Kategorien werden also Speisen hinzugefügt. Wenn es erledigt ist, dann kann ich für die aktuelle Kategorie auch die Id auf 0 setzen. Auch hier wieder ist der Grund, dass das Entity Framework sonst gegebenenfalls hingeht und den Datensatz sich einfügen kann. Und im letzten Schritt kann ich jetzt dem DbSet der Kategorien diese Kategorie hinzufügen. Zu guter Letzt nachdem die Schleifen durchgelaufen sind, weise ich dne Context an, alle Änderungen zu speichern, der Change Tracker des Entity Frameworks, der weiß also, dass wir hier lauter hinzugefügte Kategorien haben, dass es daran eine Liste von Speisen gibt, und wird diese Daten alle für mich speichern. Jetzt ... nur noch an mir, dass ich das Ganze auch aufrufe. Diesen Aufruf, den werde ich in der Klasse Startup platzieren und zwar in der Methode Configure. Dazu muss ich zum einen sagen, dass Configure nicht nur ein IHostingEnvironment benötigt, sondenr auch einen VegiContext, denn diesen Context hier muss ich an der Methode Initialize übergeben. Und dann kann ich hier an dieser Stelle meinen DbInitializer aufrufen und kann jede Methode Initialize mit den Argumenten db und env aufrufen. Das sollte jetzt dazu ausreichen, dass meine Datenbank initiall befüllt wird. Testen kann ich das Ganze einfach, indem ich meine Anwendung jetzt starte, die benutzt nämlich schon das Repository. Und mir mal anschaue, ob ich noch Daten zurückbekomme. Und sobald das Ganze gestartet ist, werde ich jetzt einmal in dem Postman wechseln, und lasse mir im Postman einmal eine Liste der Speisen geben. So, das sieht ganz gut aus, ich erkenne gerade schon, dass ich die Daten aus der Datenbank lese, was daran liegt, dass sich die IDs jetzt hier verändert haben denn die Nummer 1 war zwar ein Salat, aber die Nummer 2 war kein Getränk. Die IDs, die hat aber die Datenbank jetzt für mich vergeben, bedeutet also, die haben sich hier schlichtweg einfach geändert, da hatte ich keinen Einfluss darauf. Bei einer echten Anwendung, bei der ich die ID auch auf meiner Speisekarte, auf der gesruckten Speisekarte also benutze, würde es natürlich dann Sinn machen, hier nicht den Primärschlüssel zu benutzen, sondern diese Nummer auf der Speisekarte in einem separaten Feld zu speichern. Hier haben wir nur eine Demo-Anwendung, das ist also nicht weiter schlimm, dass sich jetzt diese ID geändet hat. Zu aller Letzt möchte ich Ihnen das auch noch beweisen, dass hier Daten in der Datenbank sind, einmal den Server Explorel hier links in Visual Studio öffne und eine neue Datenbankverbundung hinzufüge. Die Datenqulle, das ist eine SQL-Server-Datenquelle, ich benutze die localdb, da ist der Servername LocalDB und dann /mssqllocaldb. Windows-Authentifizierung ist in meinem Fall korrekt und jetzt sehen wir hier schon, es gibt eine Datenbank ElVegarianoFurio und wenn ich das jetzt öffne, dann gibt es in dieser Datenbank zwei Tabellen, nämlich Categories und Dishes. Wenn ich hier zum Beispiel mir einmal die Inhalte der Tabelle Dishes anzeigen lasse, dann sehe ich hier gleich meine Speisen, die über den enitializer anlegelegt worden sind. Zusammenfassend können wir also sagen, wenn Sie in dieser Anwendung zur Entwicklungszeit bereits mit ralistischen Testdaten testen möchten, die Sie auch in irgendeiner Art und Weise vorliegen haben, zum Beispiel in einer Json-Datei wie bei mir, dann können Sie sich einen Initializer schreiben mit dem Sie die Datenbankt initiall befüllen. Der Trick dabei ist, dass Sie in dem Initalizer zunächst EnsureCreated auf der Database-Eigenschaft aufrufen, damit die Datenbank angelegt wird, falls es Sie noch nicht gibt. Darüber hinas überprüfen wir, ob die entsprechenden Tabellen bereits gefüllt sind und falls nicht, dann lese ich hier die Daten aus und füge die geladenen Daten dem jeweiligen DBs jetzt hinzu. Wichtig ist dabe, dass ich die IDs im Fall von SQL-Server auf 0 setzen muss, falls ich einen Auto-Wert benutze, anderenfalls kann der SQL-Server das Ganze nicht einfügen. Aufgerufen habe ich das Ganze aus der Klasse Startup und dort an der Methode Configure. Hier habe ich einfach über UseMvc diese Methode Initialize aus meinem Initializer aufgerufen.

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!