Podejście Code First polega na utworzeniu modelu danych za pomocą klas języka C#. Utworzona klasa będzie reprezentowała tabelę bazy danych, a zawarte w niej właściwości (ang. property) będą odzwierciedlały kolumny tabeli. Na podstawie wskazanych klas, które mają być zawarte w bazie danych, EF Core wygeneruje odpowiednie tabele.
W tym wpisie pokażę jak utworzyć prostą bazę danych składającą się z jednej tabeli reprezentującą encję detektywów.
Na początek wybieram projekt. Będzie to zwyczajna aplikacja konsolowa w Core:
Teraz stworzę model danych w postaci klasy POCO (Plain Old CLR Objects). Jest to prosta klasa, odzwierciedlająca dany byt, która później zostanie zamieniona na tabelę bazy danych. Tutaj będzie to tabela detektywów.
public class Detective { public int DetectiveId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
Zauważcie, że model ten ma pole DetectiveId. Będzie to reprezentowało klucz główny (ang. primary key), który jest obowiązkową składową każdej tabeli bazy danych. Sprawia, że wiersze (czyli tutaj detektywi) będą zawsze unikatowe oraz identyfikowane.
Według konwencji Entity Framework, właściwość która ma być primary key powinna nazywać się Id lub <nazwa_klasy>Id. W tym przypadku zastosowałem drugą opcję.
Teraz przydało by się skorzystać z Entity Framework Core. Żeby to zrobić należy zainstalować odpowiednie paczki Nuget, albo za pomocą graficznego UI:
Albo korzystając z Package Manager Console przez wykorzystanie komend:
Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Dlaczego zainstalowałem pakiet Tools możecie przeczytać tutaj.
Główną klasą zarządzającą bazą danych w EF Core jest DbContext, a właściwie pochodna klasa, którą należy utworzyć:
class DetectiveDbContext : DbContext { public DbSet<Detective> Detectives { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server = (localdb)\mssqllocaldb; Database = BlogDetectiveDatabase; Trusted_Connection = True; "); } }
Właściwość DbSet informuje EF, że chcemy mieć tabelę o takim typie jaki jest zdefiniowany przez klasę Detective. Dzięki DbSet tworzy się bazodanowy model danych na podstawie modelu danych z naszych klas. Tabela będzie nazywała się tak, jak właściwość DbSet, tutaj Detectives.
Jednak żeby całość zadziałała należy jeszcze poinformować z jakiej bazy danych korzystamy, gdzie ją znaleźć i jak się z nią połączyć. Robi się to w metodzie OnConfiguring, gdzie wybiera się dostawcę bazy danych i przypisuje connectionStringa. W projektach innego typu niż konsolowy zazwyczaj robi się to poza klasą DbContext, np. w ASP.NET Core w pliku Startup.
I to tyle, jeżeli chodzi o część programowalną aplikacji. Teraz trzeba wygenerować tabelę wraz z bazą danych. Żeby to zrobić w Package Manager Console należy użyć komendy:
Update-Database
Baza danych się utworzy, ale konsola zwróci nam informację, że nie odnaleziono migracji. Co to jest i do czego się używa opowiem Wam w osobnym materiale. Teraz przejdźmy do utworzonej bazy danych. Należy otworzyć okienko Server Object Explorer (możecie znaleźć je w zakładce View).
Baza danych jest, ale coś w niej pusto. Znajduję się tam tylko tabela dbo._EFMigrationsHistory, a nie ma w niej tabeli detektywów. Winą są oczywiście migracje, które musimy przedtem dodać. Robi się to również w konsoli nugetów za pomocą komendy:
Add-Migration NazwaMigracji
Wygeneruje się folder z paroma klasami przypominającymi komendy SQL. Teraz gdy zaktualizujemy bazę danych, przypominam komendą:
Update-Database
Naszym oczom ukaże się prawidłowo zdefiniowana baza danych:
I tyle wystarczy na utworzenie bazy danych za pomocą podejścia Code First. Jednak na zakończenie kilka, czyli dwie uwagi:
- Nie trzeba aktualizować bazy danych przed stworzeniem migracji, żeby sama baza się utworzyła. Można utworzyć migracje na początku, a dopiero potem zaktualizować bazę danych. Tutaj chciałem tylko pokazać co się stanie. O migracjach zrobię osobny materiał.
- Aby widoczne były zmiany po drugiej aktualizacji bazy danych należy odświeżyć SQL Server Object Explorer lub bazę danych niebieską ikoną refresh.
Ja tutaj użyłem lokalnej bazy danych, która instaluje się razem z Visual Studio, do zastosowań domowych w zupełności wystarcza. ConnectionStringa możecie sobie przekopiować z bloga lub znaleźć gdzieś w internetach, zmieńcie sobie tylko nazwę bazy danych, bo pod taką nazwą będziecie ją widzieli w Server Object Explorer.