Entity Framework to kolejna generacja technologii firmy Microsoft, która zapewnia dostęp do danych. Jest to rozszerzona technologia ORM (ang. Object Rational Mapping), która ułatwia powiązanie danych w bazie danych z obiektami w aplikacji, poprzez stworzenie abstrakcyjnych modeli obiektowych w aplikacji z modeli relacyjnych lub logicznych. Dzięki temu możliwe jest tworzenie zapytań i manipulowanie danymi używając programowania zorientowanego obiektowo.
Używając Entity Framework możliwe są trzy podejścia do wyboru: Code First, Database First i Model First. Podejście Code First polega na zdefiniowaniu za pomocą kodu w języku C# typów odpowiadających modelowi danych, na podstawie którego zostanie wygenerowany schemat bazy danych. Przeciwieństwem jest podejście Model First, gdzie najpierw tworzy się model bazy danych korzystając z gotowego narzędzia w Visual Studio, a schemat bazy oraz odpowiadające mu klasy zostaną wygenerowane automatycznie przez Entity Framework. Database First z kolei polega na samodzielnym stworzeniu bazy danych, a następnie jej importowaniu, po czym tworzone są odpowiednie klasy.
Jak stworzyć bazę danych przy użyciu EF i podejścia Code First?
Tworzymy nowy projekt ASP.NET Web Application z szablonem Empty. Następnie przechodzimy do Nuget Package Managera i wyszukujemy pakiety takie jak widoczne na obrazku poniżej.
Kolejnym krokiem jest stworzenie modeli.
Poniżej przykład jednego modelu EventType.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class EventType { [Required] public string Id { get; set; } [Display(ResourceType = typeof(Resources.Event), Name = "TypeName")] [Required] public string Name{ get; set; } [Display(ResourceType = typeof(Resources.Event), Name = "TypeDescription")] public string Description { get; set; } } |
Musimy także pamiętać o dodaniu klasy kontekstu. Kontekst musi zawierać także właściwości, które reprezentować będą tabele w bazie danych. W kontekście możemy dodatkowo przeciążyć metodą OnModelCreating, gdzie możemy wprowadzić trochę ustawień, np.:
usunięcie konwencji nazewnictwa tabel w liczbie mnogiej,
1 |
modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); |
usunięcie konwencji usuwania kaskadowego,
1 |
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); |
czy też włączenie kaskadowego usuwania dla konkretnego powiązania między tabelami, za pomocą FluentAPI.
1 |
modelBuilder.Entity<Event>().HasRequired(e=>e.User).WithMany(u=>u.Events).HasForeignKey(e=>e.UserId).WillCascadeOnDelete(true); |
Prawidłowo stworzony kontekst w przypadku mojego projektu wygląda obecnie tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class TimePlannerContext : IdentityDbContext<User> { public TimePlannerContext() : base("DefaultConnection") { } public DbSet<Event> Events { get; set; } public DbSet<EventType> EventTypes { get; set; } public DbSet<Location> Locations { get; set; } public static TimePlannerContext Create() { return new TimePlannerContext(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); modelBuilder.Entity<Event>().HasRequired(e=>e.User).WithMany(u=>u.Events).HasForeignKey(e=>e.UserId).WillCascadeOnDelete(true); } } |
Gdy warstwę modelu mamy już stworzoną, możemy przystąpić do migracji, czyli aktualizacji struktury bazy danych lub raczej jej utworzenia, ponieważ jest to pierwsza migracja. W tym celu otwieramy konsolę Package Managera.
Upewniamy się żę Default project to ten dla którego chcemy włączyć migracje. Wpisujemy polecenie Enable-Migrations i dajemy enter.
Jeśli pojawi się błąd tak jak na poniższym obrazku, oznacza to że w którejś z encji zapomnieliśmy dodać właściwość Id.
W tym przypadku chodzi o klasę Location, tak więc dodajemy:
1 2 3 4 5 6 7 |
public class Location { public string Id { get; set; } … |
i wywołujemy polecenie raz jeszcze, ale tym razem konieczne jest dodanie parametru -Force:
1 |
Enable-Migrations -Force |
w przeciwnym wypadku dostaniemy komunikat:
„Migrations have already been enabled in project ‚Repository’. To overwrite the existing migrations configuration, use the -Force parameter.”
Po dodaniu migracji do projektu zostanie dodany folder Migrations z klasą Configuration.cs.
Kolejny krok to wywołanie polecenia, które utworzy migrację startową. Spowoduje to utworzenie nowej klasy w folderze Migrations, dziedziczącej po DbMigration, która zawiera dwie metody Up() i Down(). Jak się można domyśleć metoda Up() zawiera zmiany jakie mają zostać wprowadzone w bazie danych, natomiast metoda Down() jest przeciwieństwem, czyli odwraca zmiany wprowadzone przez metodę Up().
1 |
Add-migration firstMigration |
Kolejny krok to aktualizacja bazy danych.
1 |
Update-Database |
Teraz możemy sprawdzić efekt, otwierając Server Explorera z zakładki View. Jak widać tabele zostały utworzone. W przypadku wprowadzenia zmian w modelu i kolejnej migracji, struktura bazy danych zostanie zaktualizowana, bez utracenia danych w niej zawartych.
3 comments
Comments are closed.