Migracje w EF Core – pierwsza migracja

W poprzednim poście skonfigurowałem projekt pod migracje i utworzyłem lokalną bazę danych. Jak na razie utworzyłem jeden kontekst bazy danych i jedną encję (do podejrzenia w poprzednim wpisie). Teraz pora na utworzenie pierwszej tabelki.

Wpierw wygenerujemy skrypty które będą odpowiedzialne za utworzenie odpowiednich tabel w bazie – w Package Manager Console (dalej będę używał określenia konsola) wykonujemy polecenie:

dnx ef migrations add myFirstMigration

Pamiętaj aby polecenie wykonać w katalogu z odpowiednim projektem, a sam projekt powinien być skompilowany! Jeżeli wszystko jest poprawnie skonfigurowane, powinien pojawić się w katalogu z projektem, nowy katalog Migrations z dwoma plikami: MyContextModelSnapshot.cs i 20162503132955_myFirstMigration.cs. W pierwszym pliku znajduje się bieżąca „migawka” modelu, w drugim natomiast znajdują się dwie metody: Up(MigrationBuilder migrationBuilder) i Down(MigrationBuilder migrationBuilder). Pierwsza metoda zawiera instrukcje co należy zrobić w bazie danych przy aplikowaniu migracji, druga metoda natomiast zawiera informacje na wypadek wycofywania migracji:

    public partial class myFirstMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "WPMCredentials",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy",
                            SqlServerValueGenerationStrategy.IdentityColumn),
                    Description = table.Column<string>(nullable: true),
                    Login = table.Column<string>(nullable: true),
                    LoginUrl = table.Column<string>(nullable: true),
                    Name = table.Column<string>(nullable: true),
                    Password = table.Column<string>(nullable: true),
                    Url = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_WPMCredentials", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable("WPMCredentials");
        }
    }

Jak widać w powyższym listingu, w metodzie Up znajdują się polecenia utworzenia tabeli WPMCredentials(@5) i dodania odpowiednich kolumn(@9-@17) a na koniec polecenie utworzenia klucza głównego PK_WPMCredentials(@21). W metodzie Down natomiast znajduje się polecenie usunięcia całej tabelki (@27).

Szczypta magii

Teraz nadeszła pora na wykonanie tych skryptów. W konsoli wykonujemy polecenie

dnx ef database update

I…
61065657

… utworzyły się nam odpowiednie tabelki i kolumny w bazie:

tabelki

Aktualizacja modelu

Prędzej czy później przyjdzie potrzeba zaktualizowania naszego modelu. Ja do klasy WPMCredential dodaję właściwość

public DateTime Created { get; set; }

Teraz należało by zaktualizować skrypty migracji a następnie tabelkę. Wpierw należy projekt skompilować, a następnie wykonać w konsoli polecenie:

dnx ef migrations add mySecondMigration

W katalogu Migrations w projekcie pojawia się kolejny plik 20160325174817_secondMigration.cs. Zawiera on również metody Up i Down, lecz różniące się zawartością od pierwszej migracji.

    public partial class secondMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<DateTime>(
                name: "Created",
                table: "WPMCredential",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(name: "Created", table: "WPMCredential");
        }
    }

W metodzie Up jest tylko polecenie dodania nowej kolumny do już istniejącej tabelki, natomiast w metodzie Down znajduje się polecenie usuwające tę kolumnę z tabelki. Plik MyContextModelSnapshot.cs w katalogu Migration również zostaje zaktualizowany i zawiera aktualną „migawkę” naszych encji. Teraz należy wykonać polecenie:

dnx ef database update

Do bazy dodana zostaje brakująca kolumna.

Cofanie migracji

Jeżeli chcemy cofnąć zmiany w bazie do którejś z wcześniejszych migracji wykonujemy polecenie

dnx ef database update 20160325181312myFirstMigration

Zmiany związane z migracjami późniejszymi od myFirstMigration zostaną wycofane z bazy (zostaną wykonane polecenia z metod Down()). Teraz trzeba cofnąć zmiany w MyContextModelSnapshot.cs czyli w migawce modelu: wykonujemy w konsoli polecenie

dnx ef migrations remove

Zostanie usunięta ostatnia migracja (i tylko ostatnia!). Jeżeli poleceniem dnx ef database update wycofaliśmy więcej migracji, należy polecenie remove wykonywać do skutku.
Aby wycofać wszystkie migracje możemy użyć polecenia

dnx ef database update 0

Dodaj komentarz

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