Bagikan melalui


Mengelola Migrasi

Saat model Anda berubah, migrasi ditambahkan dan dihapus sebagai bagian dari pengembangan normal, dan file migrasi diperiksa ke kontrol sumber proyek Anda. Untuk mengelola migrasi, Anda harus terlebih dahulu menginstal alat baris perintah EF Core.

Tip

DbContext Jika berada dalam rakitan yang berbeda dari proyek startup, Anda dapat secara eksplisit menentukan target dan proyek startup baik di alat Package Manager Console atau alat .NET Core CLI.

Menambahkan migrasi

Setelah model diubah, Anda dapat menambahkan migrasi untuk perubahan tersebut:

dotnet ef migrations add AddBlogCreatedTimestamp

Nama migrasi dapat digunakan seperti pesan penerapan dalam sistem kontrol versi. Misalnya, Anda dapat memilih nama seperti AddBlogCreatedTimestamp jika perubahan adalah properti baru CreatedTimestamp pada entitas Anda Blog .

Tiga file ditambahkan ke proyek Anda di bawah direktori Migrasi :

  • XXXXXXXXXXXXXX_AddCreatedTimestamp.cs--File migrasi utama. Berisi operasi yang diperlukan untuk menerapkan migrasi (dalam Up) dan untuk mengembalikannya (dalam Down).
  • XXXXXXXXXXXXXX_AddCreatedTimestamp.Designer.cs--File metadata migrasi. Berisi informasi yang digunakan oleh EF.
  • MyContextModelSnapshot.cs--Rekam jepret model Anda saat ini. Digunakan untuk menentukan apa yang berubah saat menambahkan migrasi berikutnya.

Tanda waktu dalam nama file membantu membuatnya tetap diurutkan secara kronologis sehingga Anda dapat melihat perkembangan perubahan.

Namespace

Anda bebas memindahkan file Migrasi dan mengubah namespace layanannya secara manual. Migrasi baru dibuat sebagai saudara kandung dari migrasi terakhir. Atau, Anda dapat menentukan direktori pada waktu pembuatan sebagai berikut:

dotnet ef migrations add InitialCreate --output-dir Your/Directory

Catatan

Anda juga dapat mengubah namespace layanan secara independen dari direktori menggunakan --namespace.

Menyesuaikan kode migrasi

Meskipun EF Core umumnya membuat migrasi yang akurat, Anda harus selalu meninjau kode dan memastikannya sesuai dengan perubahan yang diinginkan; dalam beberapa kasus, bahkan perlu untuk melakukannya.

Ganti nama kolom

Salah satu contoh penting di mana penyesuaian migrasi diperlukan adalah saat mengganti nama properti. Misalnya, jika Anda mengganti nama properti dari Name menjadi FullName, EF Core akan menghasilkan migrasi berikut:

migrationBuilder.DropColumn(
    name: "Name",
    table: "Customers");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customers",
    nullable: true);

EF Core umumnya tidak dapat mengetahui kapan niatnya adalah untuk menghilangkan kolom dan membuat kolom baru (dua perubahan terpisah), dan kapan kolom harus diganti namanya. Jika migrasi di atas diterapkan apa adanya, semua nama pelanggan Anda akan hilang. Untuk mengganti nama kolom, ganti migrasi yang dihasilkan di atas dengan yang berikut ini:

migrationBuilder.RenameColumn(
    name: "Name",
    table: "Customers",
    newName: "FullName");

Tip

Proses perancah migrasi memperingatkan kapan operasi dapat mengakibatkan kehilangan data (seperti menghilangkan kolom). Jika Anda melihat peringatan tersebut, pastikan untuk meninjau kode migrasi untuk akurasi.

Menambahkan SQL mentah

Meskipun mengganti nama kolom dapat dicapai melalui API bawaan, dalam banyak kasus yang tidak dimungkinkan. Misalnya, kita mungkin ingin mengganti properti yang ada FirstName dan LastName dengan satu properti baru FullName . Migrasi yang dihasilkan oleh EF Core adalah sebagai berikut:

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

Seperti sebelumnya, ini akan menyebabkan kehilangan data yang tidak diinginkan. Untuk mentransfer data dari kolom lama, kami menyusun ulang migrasi dan memperkenalkan operasi SQL mentah sebagai berikut:

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET FullName = FirstName + ' ' + LastName;
");

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

Perubahan arbitrer melalui SQL mentah

SQL mentah juga dapat digunakan untuk mengelola objek database yang tidak diketahui EF Core. Untuk melakukan ini, tambahkan migrasi tanpa membuat perubahan model apa pun; Migrasi kosong akan dihasilkan, yang kemudian dapat Anda isi dengan operasi SQL mentah.

Misalnya, migrasi berikut membuat prosedur tersimpan SQL Server:

migrationBuilder.Sql(
@"
    EXEC ('CREATE PROCEDURE getFullName
        @LastName nvarchar(50),
        @FirstName nvarchar(50)
    AS
        RETURN @LastName + @FirstName;')");

Tip

EXEC digunakan ketika pernyataan harus menjadi yang pertama atau hanya satu dalam batch SQL. Ini juga dapat digunakan untuk mengatasi kesalahan pengurai dalam skrip migrasi idempogen yang dapat terjadi ketika kolom yang dirujuk saat ini tidak ada di tabel.

Ini dapat digunakan untuk mengelola aspek apa pun dari database Anda, termasuk:

  • Prosedur tersimpan
  • Pencarian teks-lengkap
  • Fungsi
  • Pemicu
  • Tampilan

Dalam kebanyakan kasus, EF Core akan secara otomatis membungkus setiap migrasi dalam transaksinya sendiri saat menerapkan migrasi. Sayangnya, beberapa operasi migrasi tidak dapat dilakukan dalam transaksi di beberapa database; untuk kasus-kasus ini, Anda dapat memilih keluar dari transaksi dengan meneruskan suppressTransaction: true ke migrationBuilder.Sql.

Menghapus migrasi

Terkadang Anda menambahkan migrasi dan menyadari bahwa Anda perlu membuat perubahan tambahan pada model EF Core Anda sebelum menerapkannya. Untuk menghapus migrasi terakhir, gunakan perintah ini.

dotnet ef migrations remove

Setelah menghapus migrasi, Anda dapat membuat perubahan model tambahan dan menambahkannya lagi.

Peringatan

Hindari menghapus migrasi apa pun yang telah diterapkan ke database produksi. Melakukannya berarti Anda tidak akan dapat mengembalikan migrasi tersebut dari database, dan dapat merusak asumsi yang dibuat oleh migrasi berikutnya.

Mencantumkan migrasi

Anda dapat mencantumkan semua migrasi yang ada sebagai berikut:

dotnet ef migrations list

Memeriksa perubahan model yang tertunda

Catatan

Fitur ini ditambahkan dalam EF Core 8.0.

Terkadang Anda mungkin ingin memeriksa apakah ada perubahan model yang dilakukan sejak migrasi terakhir. Ini dapat membantu Anda mengetahui kapan Anda atau rekan satu tim lupa menambahkan migrasi. Salah satu cara untuk melakukannya adalah menggunakan perintah ini.

dotnet ef migrations has-pending-model-changes

Anda juga dapat melakukan pemeriksaan ini secara terprogram menggunakan context.Database.HasPendingModelChanges(). Ini dapat digunakan untuk menulis pengujian unit yang gagal ketika Anda lupa menambahkan migrasi.

Mereset semua migrasi

Dalam beberapa kasus ekstrem, mungkin perlu untuk menghapus semua migrasi dan memulai kembali. Ini dapat dengan mudah dilakukan dengan menghapus folder Migrasi dan menghilangkan database Anda; pada saat itu Anda dapat membuat migrasi awal baru, yang akan berisi seluruh skema Anda saat ini.

Anda juga dapat mengatur ulang semua migrasi dan membuat satu migrasi tanpa kehilangan data Anda. Ini kadang-kadang disebut "squashing", dan melibatkan beberapa pekerjaan manual:

  1. Cadangkan database Anda, jika terjadi kesalahan.
  2. Di database Anda, hapus semua baris dari tabel riwayat migrasi (misalnya DELETE FROM [__EFMigrationsHistory] di SQL Server).
  3. Hapus folder Migrasi Anda.
  4. Buat migrasi baru dan buat skrip SQL untuk skrip tersebut (dotnet ef migrations script).
  5. Sisipkan satu baris ke dalam riwayat migrasi, untuk merekam bahwa migrasi pertama telah diterapkan, karena tabel Anda sudah ada. Sisipkan SQL adalah operasi terakhir dalam skrip SQL yang dihasilkan di atas, dan menyerupai berikut ini (jangan lupa untuk memperbarui nilai):
INSERT INTO [__EFMigrationsHistory] ([MIGRATIONID], [PRODUCTVERSION])
VALUES (N'<full_migration_timestamp_and_name>', N'<EF_version>');

Peringatan

Kode migrasi kustom apa pun akan hilang saat folder Migrasi dihapus. Penyesuaian apa pun harus diterapkan ke migrasi awal baru secara manual agar dapat dipertahankan.

Sumber Daya Tambahan: