Samouczek: część 5. Stosowanie migracji do przykładu contoso University

W tym samouczku zaczniesz używać EF Core funkcji migracji do zarządzania zmianami modelu danych. W kolejnych samouczkach dodasz więcej migracji podczas zmiany modelu danych.

W tym samouczku zostały wykonane następujące czynności:

  • Dowiedz się więcej o migracjach
  • Tworzenie migracji początkowej
  • Badanie metod w górę i w dół
  • Dowiedz się więcej o migawce modelu danych
  • Stosowanie migracji

Wymagania wstępne

Informacje o migracjach

Podczas opracowywania nowej aplikacji model danych zmienia się często i za każdym razem, gdy zmienia się model, jest on synchronizowany z bazą danych. Te samouczki zostały uruchomione, konfigurując program Entity Framework w celu utworzenia bazy danych, jeśli nie istnieje. Następnie za każdym razem, gdy zmienisz model danych — dodaj, usuń lub zmień klasy jednostek lub zmień klasę DbContext — możesz usunąć bazę danych, a program EF tworzy nową, która pasuje do modelu, i wysadza ją z danymi testowymi.

Ta metoda synchronizowania bazy danych z modelem danych działa dobrze do momentu wdrożenia aplikacji w środowisku produkcyjnym. Gdy aplikacja jest uruchomiona w środowisku produkcyjnym, zwykle przechowuje dane, które chcesz zachować, i nie chcesz tracić wszystkiego za każdym razem, gdy wprowadzasz zmiany, takie jak dodawanie nowej kolumny. Funkcja EF Core Migracje rozwiązuje ten problem, umożliwiając programowi EF aktualizowanie schematu bazy danych zamiast tworzenia nowej bazy danych.

Aby pracować z migracjami, możesz użyć konsoli Menedżer pakietów (PMC) lub interfejsu wiersza polecenia. W tych samouczkach pokazano, jak używać poleceń interfejsu wiersza polecenia. Informacje o pmC są na końcu tego samouczka.

Usuwanie bazy danych

Zainstaluj EF Core narzędzia jako narzędzie globalne i usuń bazę danych:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Uwaga

Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet). Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.

W poniższej sekcji opisano sposób uruchamiania poleceń interfejsu wiersza polecenia.

Tworzenie migracji początkowej

Zapisz zmiany i skompiluj projekt. Następnie otwórz okno polecenia i przejdź do folderu projektu. Oto szybki sposób, aby to zrobić:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Otwórz folder w Eksplorator plików z menu kontekstowego.

    Open in File Explorer menu item

  • Wprowadź ciąg "cmd" na pasku adresu i naciśnij klawisz Enter.

    Open command window

Wprowadź następujące polecenie w oknie polecenia:

dotnet ef migrations add InitialCreate

W poprzednich poleceniach zostaną wyświetlone dane wyjściowe podobne do następujących:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

Jeśli zostanie wyświetlony komunikat o błędzie "Nie można uzyskać dostępu do pliku ... ContosoUniversity.dll, ponieważ jest on używany przez inny proces.", znajdź ikonę IIS Express na pasku zadań systemu Windows, a następnie kliknij ją prawym przyciskiem myszy, a następnie kliknij pozycję ContosoUniversity > Zatrzymaj lokację.

Badanie metod w górę i w dół

Po wykonaniu migrations add polecenia program EF wygenerował kod, który utworzy bazę danych od podstaw. Ten kod znajduje się w folderze Migrations w pliku o nazwie <timestamp>_InitialCreate.cs. Metoda UpInitialCreate klasy tworzy tabele bazy danych, które odpowiadają zestawom jednostek modelu danych, a Down metoda je usuwa, jak pokazano w poniższym przykładzie.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Migracje wywołuje metodę Up implementowania zmian modelu danych na potrzeby migracji. Po wprowadzeniu polecenia w celu wycofania aktualizacji funkcja Migrations wywołuje metodę Down .

Ten kod dotyczy początkowej migracji, która została utworzona podczas wprowadzania migrations add InitialCreate polecenia. Parametr nazwy migracji ("InitialCreate" w przykładzie) jest używany dla nazwy pliku i może być dowolny. Najlepiej wybrać słowo lub frazę podsumowującą czynności wykonywane w migracji. Na przykład można nazwać późniejszą migrację "AddDepartmentTable".

Jeśli migracja początkowa została utworzona, gdy baza danych już istnieje, zostanie wygenerowany kod tworzenia bazy danych, ale nie trzeba go uruchamiać, ponieważ baza danych jest już zgodna z modelem danych. Po wdrożeniu aplikacji w innym środowisku, w którym baza danych jeszcze nie istnieje, ten kod zostanie uruchomiony w celu utworzenia bazy danych, dlatego warto go najpierw przetestować. Dlatego wcześniej usunięto bazę danych , aby migracje mogły utworzyć nową od podstaw.

Migawka modelu danych

Migracje tworzy migawkę bieżącego schematu bazy danych w programie Migrations/SchoolContextModelSnapshot.cs. Podczas dodawania migracji program EF określa, co zmieniło się, porównując model danych z plikiem migawek.

Użyj polecenia dotnet ef migrations remove, aby usunąć migrację. dotnet ef migrations remove Usuwa migrację i gwarantuje, że migawka zostanie poprawnie zresetowana. Jeśli dotnet ef migrations remove nie powiedzie się, użyj polecenia dotnet ef migrations remove -v , aby uzyskać więcej informacji na temat błędu.

Zobacz EF Core Migracje w środowiskach zespołowych , aby uzyskać więcej informacji na temat sposobu użycia pliku migawki.

Stosowanie migracji

W oknie polecenia wprowadź następujące polecenie, aby utworzyć bazę danych i tabele w nim.

dotnet ef database update

Dane wyjściowe polecenia są podobne do migrations add polecenia, z tą różnicą, że są wyświetlane dzienniki poleceń SQL, które konfigurują bazę danych. Większość dzienników zostanie pominięta w poniższych przykładowych danych wyjściowych. Jeśli wolisz nie wyświetlać tego poziomu szczegółów w komunikatach dziennika, możesz zmienić poziom dziennika w appsettings.Development.json pliku. Aby uzyskać więcej informacji, zobacz Rejestrowanie na platformie .NET Core i ASP.NET Core.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

Użyj Eksplorator obiektów programu SQL Server, aby sprawdzić bazę danych tak jak w pierwszym samouczku. Zauważysz dodanie tabeli __EFMigrationsHistory, która śledzi, które migracje zostały zastosowane do bazy danych. Wyświetl dane w tej tabeli i zobaczysz jeden wiersz dla pierwszej migracji. (Ostatni dziennik w poprzednim przykładzie danych wyjściowych interfejsu wiersza polecenia przedstawia instrukcję INSERT, która tworzy ten wiersz).

Uruchom aplikację, aby sprawdzić, czy wszystko nadal działa tak samo jak poprzednio.

Students Index page

Porównanie interfejsu wiersza polecenia i pmc

Narzędzia EF do zarządzania migracjami są dostępne za pomocą poleceń interfejsu wiersza polecenia platformy .NET Core lub poleceń cmdlet programu PowerShell w oknie konsoli Menedżer pakietów programu Visual Studio (PMC). W tym samouczku pokazano, jak używać interfejsu wiersza polecenia, ale jeśli wolisz, możesz użyć kontrolera PMC.

Polecenia EF dla poleceń PMC znajdują się w pakiecie Microsoft.EntityFrameworkCore.Tools . Ten pakiet jest uwzględniony w metapakiecie Microsoft.AspNetCore.App, dlatego nie musisz dodawać odwołania do pakietu, jeśli aplikacja ma odwołanie do pakietu .Microsoft.AspNetCore.App

Ważne: nie jest to ten sam pakiet, który jest instalowany dla interfejsu wiersza polecenia, edytując .csproj plik. Nazwa tego elementu kończy się na , Toolsw przeciwieństwie do nazwy pakietu interfejsu wiersza polecenia, która kończy się na .Tools.DotNet

Aby uzyskać więcej informacji na temat poleceń interfejsu wiersza polecenia, zobacz interfejs wiersza polecenia platformy .NET Core.

Aby uzyskać więcej informacji na temat poleceń PMC, zobacz Menedżer pakietów Console (Visual Studio).

Uzyskiwanie kodu

Pobierz lub wyświetl ukończoną aplikację.

Następny krok

Przejdź do następnego samouczka, aby rozpocząć przeglądanie bardziej zaawansowanych tematów dotyczących rozszerzania modelu danych. Podczas tworzenia i stosowania dodatkowych migracji.