ASP.NET

Entity Framework i podejście code-first w ASP.NET MVC – pierwsze kroki

W dzisiejszym wpisie chciałbym przedstawić Ci podejście code-first, z wykorzystaniem Entity Framework. Jest to bardzo prosty i przyjemny sposób projektowania logiki aplikacji oraz powiązanej z nią struktury bazy danych. Możliwości, jaki daje to podejście wykorzystuję w projekcie todo.team. Temat ten podzieliłem na trzy osobne posty. Dzisiaj opowiem Ci o tworzeniu encji, konfiguracji EF i uruchomieniu pierwszej migracji. Drugi wpis (przewidziany na przyszły wtorek) opisywał będzie budowanie relacji pomiędzy tabelami bazy. Trzeci natomiast zawierał będzie informacje o tym, jak z przygotowanych encji stworzyć obsługujące je widoki i nałożyć na pola encji specjalne ograniczenia i wymagania co do przyjmowanych przez nie wartości. Zapraszam do lektury.

Instalacja Entity Framework

Korzystając z konsoli menadżera pakietów NuGet, zainstaluję teraz w projekcie platformę EntityFramework.

PM> Install-Package EntityFramework
Instalacja EntityFramework za pomocą NuGet
Instalacja EntityFramework za pomocą NuGet

Tworzenie modelu domeny

Struktura bazy będzie odwzorowywać encje użyte w projekcie. Załóżmy, że aplikacja posiadać będzie dwa takie podstawowe elementy: Student i Przedmiot.

Każdy Student będzie mógł być opisany następującymi atrybutami:

  • imię,
  • nazwisko,
  • rocznik,
  • płeć,
  • pesel.

Jak się pewnie domyślasz, encja Student będzie automatycznie przetwarzana na tabelę SQL, która posiadać będzie wyżej wymienione kolumny. Proste?

Stworzę zatem jeszcze jedną encję – Przedmiot:

  • nazwa,
  • godziny,
  • obowiązkowy.

No dobrze. Skoro już wiem, jakich tabel dokładnie potrzebuję, przyszedł czas na stworzenie odpowiadających im klas. Dla studenta kod klasy będzie taki:

namespace codefirst.Entities
{
    public class Student
    {
        [Key]
        public int id { get; set; }
        public string imie { get; set; }
        public string nazwisko { get; set; }
        public string rocznik { get; set; }
        public string plec { get; set; }
        public string pesel { get; set; }
    }
}

A co z Przedmiotem?

namespace codefirst.Entities
{
    public class Przedmiot
    {
        [Key]
        public int id { get; set; }
        public string nazwa { get; set; }
        public int godziny { get; set; }
        public bool obowiazkowy { get; set; }
    }
}

Studentowi zostawiłem same pola tekstowe, natomiast Przedmiot oprócz pola tekstowego zawiera jedno pole liczbowe oraz kolumnę przechowująca wartość logiczną (true/false). Każde pola mogą mieć nałożone różnego rodzaju ograniczenia lub wymagania. Opiszę to w trzecim, piątkowym artykule. Dzisiaj wykorzystam jednak adnotację [key], która opisuje pola id jako klucz główny tabel, które zostaną stworzone w kolejnych punktach. Skoro encje są gotowe, przejdę krok dalej.

Tworzenie kontekstu Entity Framework

Teraz należy przygotować mapowanie stworzonego modelu aplikacji z bazą danych. W tym celu założę nowy katalog o nazwie Concrete, a w nim plik EfDbContext.cs z następującą zawartością.

namespace codefirst.Content
{
    public class EfDbContext : DbContext
    {
        public DbSet<Student> Studenci { get; set; }
        public DbSet<Przedmiot> Przedmioty { get; set; }
    }
}

Od tej pory, wszelkie zmiany w budowie encji oraz samo ich istnienie będą kojarzone ze strukturą bazy danych.

Tworzenie bazy danych

Przejdę szybko do Eksploratora serwera i stworzę nową, pustą bazę danych za pomocą funkcji „Łączenie z bazą danych”.

Parametry tworzenia nowej bazy danych
Parametry tworzenia nowej bazy danych

Podłączanie bazy danych

Nie łączyłem jeszcze aplikacji z bazą. Jedyną zmianą, którą muszę teraz wprowadzić, jest aktualizacja tzw. connectionString na taki, który będzie współpracował z Entity Framework. Zrobię to w pliku Web.config.

<connectionStrings>
  <add name="EFDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDb;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Tworzenie migracji

Teraz, aby automatycznie stworzyć strukturę nowej bazy danych muszę wygenerować nową migrację. Znowu skorzystam z konsoli menadżera pakietów NuGet. Właśnie taką przewagę daje podejście code-first. Bez znajomości SQL jesteś w stanie przygotować całą zawartość bazy, z którą będzie łączyła się Twoja aplikacja.

Jeśli to nowy projekt, będzie konieczne włączenie obsługi migracji.

PM> Enable-Migrations -ContextTypeName codefirst.Concrete.EfDbContext

Polecenie to wygenerowało dodatkowy katalog w rozwiązaniu.

Wygenerowany katalog i konfiguracja migracji
Wygenerowany katalog i konfiguracja migracji

Jeśli obsługa migracji została włączona, mogę spokojnie wywołać polecenie stworzenia nowej migracji.

PM> Add-Migration codefirst

Ostatni człon to nazwa migracji. Możesz wpisać swoją.

Zajrzyj do katalogu Migrations. Powstały w nim nowe pliki, które opisują tabele bazy danych, która zostanie zaraz stworzona.

namespace codefirst.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class codefirst : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Przedmiots",
                c => new
                    {
                        id = c.Int(nullable: false, identity: true),
                        nazwa = c.String(),
                        godziny = c.Int(nullable: false),
                        obowiazkowy = c.Boolean(nullable: false),
                    })
                .PrimaryKey(t => t.id);
            
            CreateTable(
                "dbo.Students",
                c => new
                    {
                        id = c.Int(nullable: false, identity: true),
                        imie = c.String(),
                        nazwisko = c.String(),
                        rocznik = c.String(),
                        plec = c.String(),
                        pesel = c.String(),
                    })
                .PrimaryKey(t => t.id);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.Students");
            DropTable("dbo.Przedmiots");
        }
    }
}

Aktualizacja bazy danych

Nadszedł czas na ostateczny cios. Tym razem w NuGet zlecę aktualizację bazy danych.

PM> Update-Database

Poszło! Nie tworzyłem nic ręcznie, a w menadżerze bazy widzę taki oto efekt.

Automatycznie wygenerowana struktura tabel
Automatycznie wygenerowana struktura tabel

Podsumowanie

Na dzisiaj to tyle. Wiesz już, jak wykorzystać podejście code-first, która znacznie przyśpiesza i ułatwia pisanie aplikacji. Dzięki powyższym czynnościom możesz skupić się na programowaniu, a nie na zabawach z SQLem. W przyszły wtorek zaprezentuje relacje pomiędzy tabelami, natomiast w kolejny pokażę, jak ograniczać wartości w kolumnach do wybranych przez siebie parametrów.

Kolejny wpis z serii: Entity Framework i podejście code-first w ASP.NET MVC – relacje

Grafika główna pochodzi z tego kanału.

Tagi:asp.netcode-firstDaj Się Poznać 2017encjeentity frameworklogika aplikacji

komentarze 2

  • Awatar
    Krzysiek

    4 kwietnia 2017 19:59

    Czekam na więcej. Myślę, że uporządkuję sobie wiedzę z EF dzięki Twoim wpisom. Pozdrawiam! ;)

    Odpowiedz
    • Awatar
      Michał Kortas

      5 kwietnia 2017 13:51

      Dzięki, na pewno będą jeszcze dwa wpisy na blogu na ten temat. Ale może rozszerzę to trochę bardziej. Pozdrawiam!

      Odpowiedz

Zostaw odpowiedź