Tutorial: Bagian 5, terapkan migrasi ke sampel Universitas Contoso

Dalam tutorial ini, Anda mulai menggunakan EF Core fitur migrasi untuk mengelola perubahan model data. Dalam tutorial selanjutnya, Anda akan menambahkan lebih banyak migrasi saat mengubah model data.

Di tutorial ini, Anda akan:

  • Pelajari tentang migrasi
  • Membuat migrasi awal
  • Memeriksa metode Naik dan Turun
  • Pelajari tentang rekam jepret model data
  • Menerapkan migrasi

Prasyarat

Tentang migrasi

Saat Anda mengembangkan aplikasi baru, model data Anda sering berubah, dan setiap kali model berubah, model tidak sinkron dengan database. Anda memulai tutorial ini dengan mengonfigurasi Kerangka Kerja Entitas untuk membuat database jika tidak ada. Kemudian setiap kali Anda mengubah model data -- menambahkan, menghapus, atau mengubah kelas entitas atau mengubah kelas DbContext Anda -- Anda dapat menghapus database dan EF membuat yang baru yang cocok dengan model, dan menyemainya dengan data pengujian.

Metode ini untuk menjaga database tetap sinkron dengan model data berfungsi dengan baik sampai Anda menyebarkan aplikasi ke produksi. Ketika aplikasi berjalan dalam produksi, aplikasi biasanya menyimpan data yang ingin Anda simpan, dan Anda tidak ingin kehilangan semuanya setiap kali Anda membuat perubahan seperti menambahkan kolom baru. Fitur EF Core Migrasi memecahkan masalah ini dengan mengaktifkan EF untuk memperbarui skema database alih-alih membuat database baru.

Untuk bekerja dengan migrasi, Anda dapat menggunakan Package Manager Console (PMC) atau CLI. Tutorial ini menunjukkan cara menggunakan perintah CLI. Informasi tentang PMC ada di akhir tutorial ini.

Menghapus database

Instal EF Core alat sebagai alat global dan hapus database:

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

Catatan

Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch. Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.

Bagian berikut menjelaskan cara menjalankan perintah CLI.

Membuat migrasi awal

Simpan perubahan Anda dan bangun proyek. Kemudian buka jendela perintah dan navigasikan ke folder proyek. Berikut adalah cara cepat untuk melakukannya:

  • Di Penjelajah Solusi, klik kanan proyek dan pilih Buka Folder di File Explorer dari menu konteks.

    Open in File Explorer menu item

  • Masukkan "cmd" di bilah alamat dan tekan Enter.

    Open command window

Masukkan perintah berikut di jendela perintah:

dotnet ef migrations add InitialCreate

Dalam perintah sebelumnya, output yang mirip dengan berikut ini ditampilkan:

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'

Jika Anda melihat pesan kesalahan "tidak dapat mengakses file ... ContosoUniversity.dll karena sedang digunakan oleh proses lain.", temukan ikon IIS Express di Baki Sistem Windows, dan klik kanan, lalu klik Situs Penghentian ContosoUniversity>.

Memeriksa metode Naik dan Turun

Saat Anda menjalankan migrations add perintah, EF menghasilkan kode yang akan membuat database dari awal. Kode ini ada di folder Migrasi , dalam file bernama <timestamp>_InitialCreate.cs. Metode UpInitialCreate kelas membuat tabel database yang sesuai dengan kumpulan entitas model data, dan Down metode menghapusnya, seperti yang ditunjukkan dalam contoh berikut.

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
    }
}

Migrasi memanggil Up metode untuk menerapkan perubahan model data untuk migrasi. Saat Anda memasukkan perintah untuk mengembalikan pembaruan, Migrasi memanggil Down metode .

Kode ini untuk migrasi awal yang dibuat saat Anda memasukkan migrations add InitialCreate perintah. Parameter nama migrasi ("InitialCreate" dalam contoh) digunakan untuk nama file dan dapat menjadi apa pun yang Anda inginkan. Yang terbaik adalah memilih kata atau frasa yang meringkas apa yang sedang dilakukan dalam migrasi. Misalnya, Anda mungkin memberi nama migrasi selanjutnya "AddDepartmentTable".

Jika Anda membuat migrasi awal saat database sudah ada, kode pembuatan database dibuat tetapi tidak harus dijalankan karena database sudah cocok dengan model data. Saat Anda menyebarkan aplikasi ke lingkungan lain di mana database belum ada, kode ini akan berjalan untuk membuat database Anda, jadi ada baiknya mengujinya terlebih dahulu. Itu sebabnya Anda menjatuhkan database sebelumnya -- sehingga migrasi dapat membuat database baru dari awal.

Rekam jepret model data

Migrasi membuat rekam jepret skema database saat ini di Migrations/SchoolContextModelSnapshot.cs. Saat Anda menambahkan migrasi, EF menentukan apa yang berubah dengan membandingkan model data dengan file rekam jepret.

Gunakan perintah hapus migrasi dotnet ef untuk menghapus migrasi. dotnet ef migrations remove menghapus migrasi dan memastikan rekam jepret diatur ulang dengan benar. Jika dotnet ef migrations remove gagal, gunakan dotnet ef migrations remove -v untuk mendapatkan informasi lebih lanjut tentang kegagalan.

Lihat EF Core Migrasi di Lingkungan Tim untuk informasi selengkapnya tentang cara file rekam jepret digunakan.

Menerapkan migrasi

Di jendela perintah, masukkan perintah berikut untuk membuat database dan tabel di dalamnya.

dotnet ef database update

Output dari perintah mirip migrations add dengan perintah, kecuali Anda melihat log untuk perintah SQL yang menyiapkan database. Sebagian besar log dihilangkan dalam output sampel berikut. Jika Anda lebih suka tidak melihat tingkat detail ini dalam pesan log, Anda dapat mengubah tingkat log dalam appsettings.Development.json file. Untuk informasi selengkapnya, lihat Pengelogan .NET Core dan 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.

Gunakan SQL Server Object Explorer untuk memeriksa database seperti yang Anda lakukan di tutorial pertama. Anda akan melihat penambahan tabel __EFMigrationsHistory yang melacak migrasi mana yang telah diterapkan ke database. Lihat data dalam tabel tersebut dan Anda akan melihat satu baris untuk migrasi pertama. (Log terakhir dalam contoh output CLI sebelumnya menunjukkan pernyataan INSERT yang membuat baris ini.)

Jalankan aplikasi untuk memverifikasi bahwa semuanya masih berfungsi sama seperti sebelumnya.

Students Index page

Membandingkan CLI dan PMC

Alat EF untuk mengelola migrasi tersedia dari perintah .NET Core CLI atau dari cmdlet PowerShell di jendela Visual Studio Package Manager Console (PMC). Tutorial ini menunjukkan cara menggunakan CLI, tetapi Anda dapat menggunakan PMC jika mau.

Perintah EF untuk perintah PMC berada dalam paket Microsoft.EntityFrameworkCore.Tools . Paket ini disertakan dalam Microsoft.AspNetCore.App metapackage, sehingga Anda tidak perlu menambahkan referensi paket jika aplikasi Anda memiliki referensi paket untuk Microsoft.AspNetCore.App.

Penting: Ini bukan paket yang sama dengan paket yang Anda instal untuk CLI dengan mengedit .csproj file. Nama yang satu ini berakhiran Tools, tidak seperti nama paket CLI yang berakhiran Tools.DotNet.

Untuk informasi selengkapnya tentang perintah CLI, lihat .NET Core CLI.

Untuk informasi selengkapnya tentang perintah PMC, lihat Package Manager Console (Visual Studio).

Mendapatkan kode

Unduh atau lihat aplikasi yang telah selesai.

Langkah selanjutnya

Lanjutkan ke tutorial berikutnya untuk mulai melihat topik yang lebih canggih tentang memperluas model data. Sepanjang cara Anda akan membuat dan menerapkan migrasi tambahan.