Opstellen van de database

In de map Database maken we een nieuwe klasse MovieDbContext. Deze gaat overerven van DbContext, dat alle functionaliteit bezit om onze database op te zetten. Alleen willen we dat in deze database ook de films komen dat wij in onze database zetten.

We gebruiken DbSet voor de tabel te maken gebaseerd op de klasse Movie. Daarna gaan we naar MovieDatabase.cs, waar we een paar veranderingen zullen moeten doorvoeren. private int counter mag verwijderd worden, voor het duidelijk te maken op de screenshots zet ik het gewoon in comments.

Ook het Id zal niet meer manueel opgeteld hoeven te worden.

De objecten dat we op voorhand in de database hadden gestoken, mag je ook weg doen, aangezien onze data niet meer gewiped zal worden bij het sluiten van de applicatie.

In plaats van een List<Movie> gaan we nu MovieDbContext gebruiken.

Nu ga je nog een hoop errors hebben omdat movies niet meer bestaat, dat komt omdat je uit movieDbContext de tabel Movies moet aanduiden.

Natuurlijk is dat vervelend, zeker als je heel veel methodes hebt. Wat je kan doen is een nieuwe variabele movies maken met een verwijzing naar movieDbContext.Movies, en dan hoef je niets meer aan te passen.

Zoals je ziet zullen alle errors mooi verdwijenen. Je zal zien dat movieDbContext nu grijs zal worden omdat we hem eigenlijk niet gebruiken, maar verwijder deze niet aangezien we hem nog gaan nodig hebben.

In de Startup klasse gaan we een nieuwe service toevoegen, we moeten tegen de applicatie zeggen dat hij MovieDbContext zal moeten gebruiken en zal moeten connecteren met de SqlServer. Daar geven we uiteindelijk nog de ConnectionString mee.

Je ziet ook dat Singleton veranderd naar een Transient. Aangezien we met een simpele list werkte moesten we hier maar een object voor maken met die eenzelfde verwijzing. Als we een Transient gebruiken zal die een nieuw object maken voor elke controller en elke service.

In appsettings.json moeten we nu nog de ConnectionString noteren.

Zoals je ziet heet de string DefaultConnection, deze moet hetzelfde zijn als de string in de Startup klasse.

Server moet hetzelfde zijn als de naam van je server. Weet je deze niet? Druk dan eens in Microsoft SQL Server Management Studio op Connect, en copy/paste daar je server name.

Onder Database zet je de naam dat je wilt geven aan je database. Uiteindelijk open je de Package Manager Console.

We gaan twee commands gebruiken in deze console. De eerste heet add-migration. Daarachter kan je een naam geven aan de migration, bijvoorbeeld initial.

Er zal een mapje Migrations aangemaakt worden met daarin een klasse met de naam dat je gegeven hebt. Hier kan je nakijken of alles klopt. Je ziet bijvoorbeeld dat er een table gemaakt zal worden, met de naam Movies. Je zal zien dat je Id automatisch Identity krijgt, en dat deze ook de Primary Key krijgt. Je hebt dit niet zelf ingesteld, maar Entity Framework Core is slim genoeg om dit te herkennen doordat we het Id genoemd hebben.

Nu, we gaan een paar dingen afspreken.

  • Je gaat nooit een aanpassing maken in een migration klasse tenzij je heel goed weet waar je mee bezig bent. Als je ergens niet akkoord mee bent, geef je het remove-migration command in (zoals de Package Manager Console zegt als de klasse is aangemaakt), pas je hem in je domain klasse aan en doe je een nieuwe migration.
  • Je gaat nooit zomaar migrations verwijderen tenzij je heel goed weet waar je mee bezig bent. Als jij een project op een andere computer wilt ophalen, heb je die database nog niet. Door de migrations te behouden weet je applicatie heel goed hoe de database er uit zal moeten zien door stap voor stap elke migration af te gaan, en kan je met een heel simpele command die database aanmaken op andere computers.

Dat command heet update-database.

Als je nu in SSMS een kijkje neemt, zal je zien dat de database er staat.

In de tabel Movies lijken de kolommen ook te kloppen.

Als we nu een kaarsje laten branden en hopen dat ons programma werkt, zien we dat als we een film toevoegen dat er… niets gebeurd is. En dat komt door het kleine addertje onder het gras. Als we een film toevoegen aan een list, zal die daar in blijven staan. Bij een database zullen we altijd nog de SaveChanges moeten oproepen, als er een verandering gebeurd.

En jazeker, we zien dat deze nu ook in onze database staat.

Als we nu opnieuw naar onze website gaan, zien we dat de films bekijkbaar zijn.

Zo! Hierbij staat alles mooi klaar. Als je nog iets aan de database wilt toevoegen, doe je gewoon hetzelfde. Als je bijvoorbeeld een kolom van de movie director wilt, voeg je deze gewoon toe aan je Movie klasse, en doe je een nieuwe migration en update.