Scaffolding w Entity Framework Core 1

Szukając informacji do poprzednich wpisów (wpisy tu i tu) o migracjach natknąłem się na informacje o scaffoldingu. Scaffolding w Entity Framework to proces odwrotny od migracji – na podstawie istniejącej bazy tworzona jest odpowiednia klasa z kontekstem i odpowiadające tabelkom – klasy encji. W poprzednich wersjach EF, aby używać scaffoldingu do budowy aplikacji, należało posłużyć się zewnętrznymi narzędziami – teraz to wszystko dostępne jest „z pudełka”.

Budujemy rusztowanie.

Aby zacząć, należy doinstalować z nugeta paczkę EntityFramework.MicrosoftSqlServer.Design. Oczywiście w projekcie muszą być już skonfigurowane migracje (jak to zrobić napisałem tutaj).
Kolejnym krokiem jest przejście w konsoli do katalogu z projektem w którym ma się wygenerować nasz kontekst. Teraz należy wykonać tylko plecenie:

dnx ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=WPMDatabase" EntityFramework.MicrosoftSqlServer 

…aby wygenerowały się odpowiednie klasy. Ciąg "Data Source=(localdb)..." to po prostu connection string którego używałem już we wcześniejszych wpisach, odchudzony tylko o niepotrzebne argumenty, a podwójne backslashe zamieniłem na pojedyncze. Natomiast EntityFramework.MicrosoftSqlServer to nazwa providera bazy danych – możesz go odnaleźć w pliku project.json.

Teraz spójrzmy jakie klasy się potworzyły. W katalogu projektu utworzona została klasa kontekstu i klasy encji. Klasa kontekstu:

    public partial class WPMDatabaseContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=WPMDatabase");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
        }

        public virtual DbSet<WPMCredential> WPMCredential { get; set; }
    }

Encja WPMCredential:

    public partial class WPMCredential
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public string Login { get; set; }
        public string LoginUrl { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
        public string Url { get; set; }
    }

Gdybym miał więcej tabel w bazie, pewnie klasa kontekstu by była bardziej rozbudowana. Ale jak widać, dzięki jednej komendzie (pomijając czynności konfiguracyjne) mamy zaoszczędzony czas na tworzenie klas „z palucha”.
Przy generowaniu klas trzeba pamiętać że za każdym razem klasa zostaje usunięta i utworzona na nowo, więc wszelkie dopisane właściwości czy metody zostaną skasowane. Jeżeli jednak chcemy mieć własny kod w klasie encji, powinniśmy utworzyć oddzielny plik z tą klasą i oznaczyć taką klasę jako partial (oczywiście klasa musi być w tej samej przestrzeni nazw).

Przydatne przełączniki

Domyślnie encje są konfigurowane za pomocą Fluent API. Jeżeli chcemy używać Data Annotations musimy użyć przełącznika -a

dnx ef dbcontext scaffold "connection string" EntityFramework.MicrosoftSqlServer -a

Jeżeli chcemy wygenerować klasę encji dla jednej tabelki korzystamy z przełącznika -t "nazwaTabeli"

dnx ef dbcontext scaffold "connection string" EntityFramework.MicrosoftSqlServer -t "WPMCredential"

Niestety nie wiem jak postępować gdy chcę wygenerować klasy dla dwóch lub więcej tabelek, próbowałem rozdzielać średnikiem, spacją i przecinkiem, lecz to wszystko na nic.

Słowo na koniec

Zagłębiając się w tajniki Entity Framework Core 1 coraz bardziej odbiegam od swego projektu konkursowego (no ale w końcu jednym z celów konkursu jest poznawanie nowych technologi), więc już następny post będzie na temat projektu.

One thought on “Scaffolding w Entity Framework Core 1

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *