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.
Masukkan "cmd" di bilah alamat dan tekan Enter.
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 ContosoUniversity > Stop Site.
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 Up
InitialCreate
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.
Membandingkan CLI dan PMC
Alat EF untuk mengelola migrasi tersedia dari perintah .NET 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 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.
ASP.NET Core