Bagikan melalui


Migrasi Pertama Kode Otomatis

Migrasi Otomatis memungkinkan Anda menggunakan Migrasi Pertama Kode tanpa memiliki file kode di proyek Anda untuk setiap perubahan yang Anda buat. Tidak semua perubahan dapat diterapkan secara otomatis - misalnya penggantian nama kolom memerlukan penggunaan migrasi berbasis kode.

Catatan

Artikel ini mengasumsikan Anda tahu cara menggunakan Migrasi Pertama Kode dalam skenario dasar. Jika tidak, Maka Anda harus membaca Migrasi Pertama Kode sebelum melanjutkan.

Rekomendasi untuk Lingkungan Tim

Anda dapat menyela migrasi otomatis dan berbasis kode tetapi ini tidak disarankan dalam skenario pengembangan tim. Jika Anda adalah bagian dari tim pengembang yang menggunakan kontrol sumber, Anda harus menggunakan migrasi otomatis murni atau migrasi berbasis kode murni. Mengingat batasan migrasi otomatis, sebaiknya gunakan migrasi berbasis kode di lingkungan tim.

Membangun Model Awal & Database

Sebelum mulai menggunakan migrasi, kita memerlukan proyek dan model Code First untuk dikerjakan. Untuk panduan ini kita akan menggunakan model Blog dan Posting kanonis.

  • Membuat aplikasi MigrationsAutomaticDemo Console baru
  • Menambahkan versi terbaru paket EntityFramework NuGet ke proyek
    • Alat –> Manajer Paket Pustaka –> Konsol Manajer Paket
    • Jalankan perintah Install-Package EntityFramework
  • Tambahkan file Model.cs dengan kode yang ditunjukkan di bawah ini. Kode ini menentukan satu kelas Blog yang membentuk model domain kami dan kelas BlogContext yang merupakan konteks Code First EF kami
    using System.Data.Entity;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity.Infrastructure;

    namespace MigrationsAutomaticDemo
    {
        public class BlogContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Name { get; set; }
        }
    }
  • Sekarang setelah kita memiliki model, saatnya untuk menggunakannya untuk melakukan akses data. Perbarui file Program.cs dengan kode yang ditunjukkan di bawah ini.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MigrationsAutomaticDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new BlogContext())
                {
                    db.Blogs.Add(new Blog { Name = "Another Blog " });
                    db.SaveChanges();

                    foreach (var blog in db.Blogs)
                    {
                        Console.WriteLine(blog.Name);
                    }
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
  • Jalankan aplikasi Anda dan Anda akan melihat bahwa database MigrationsAutomaticCodedemo.BlogContext dibuat untuk Anda.

    Database LocalDB

Mengaktifkan Migrasi

Saatnya untuk membuat beberapa perubahan lagi pada model kami.

  • Mari kita perkenalkan properti Url ke kelas Blog.
    public string Url { get; set; }

Jika Anda menjalankan aplikasi lagi, Anda akan mendapatkan InvalidOperationException yang menyatakan Model yang mendukung konteks 'BlogContext' telah berubah sejak database dibuat. Pertimbangkan untuk menggunakan Migrasi Code First untuk memperbarui database (http://go.microsoft.com/fwlink/?LinkId=238269).

Seperti yang disarankan pengecualian, saatnya untuk mulai menggunakan Migrasi Code First. Karena kita ingin menggunakan migrasi otomatis, kita akan menentukan sakelar –EnableAutomaticMigrations .

  • Jalankan perintah Enable-Migrations –EnableAutomaticMigrations di Package Manager Console Perintah ini telah menambahkan folder Migrasi ke proyek kami. Folder baru ini berisi satu file:

  • Kelas Konfigurasi. Kelas ini memungkinkan Anda mengonfigurasi perilaku Migrasi untuk konteks Anda. Untuk panduan ini, kami hanya akan menggunakan konfigurasi default. Karena hanya ada satu konteks Code First dalam proyek Anda, Enable-Migrations telah secara otomatis mengisi jenis konteks yang diterapkan konfigurasi ini.

 

Migrasi Otomatis Pertama Anda

Migrasi Code First memiliki dua perintah utama yang akan Anda kenal.

  • Add-Migration akan membuat perancah migrasi berikutnya berdasarkan perubahan yang telah Anda buat pada model Anda sejak migrasi terakhir dibuat
  • Update-Database akan menerapkan migrasi yang tertunda ke database

Kita akan menghindari penggunaan Add-Migration (kecuali kita benar-benar perlu) dan fokus pada membiarkan Migrasi Pertama Kode secara otomatis menghitung dan menerapkan perubahan. Mari kita gunakan Update-Database untuk mendapatkan Migrasi Pertama Kode untuk mendorong perubahan ke model kami (properti Blog.Url baru) ke database.

  • Jalankan perintah Update-Database di Package Manager Console.

Database MigrationsAutomaticDemo.BlogContext sekarang diperbarui untuk menyertakan kolom Url dalam tabel Blog .

 

Migrasi Otomatis Kedua Anda

Mari kita buat perubahan lain dan biarkan Migrasi Pertama Kode secara otomatis mendorong perubahan ke database untuk kita.

  • Mari tambahkan juga kelas Posting baru
    public class Post
    {
        public int PostId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
  • Kami juga akan menambahkan koleksi Posting ke kelas Blog untuk membentuk akhir hubungan lainnya antara Blog dan Posting
    public virtual List<Post> Posts { get; set; }

Sekarang gunakan Update-Database untuk memperbarui database. Kali ini mari tentukan bendera –Verbose sehingga Anda dapat melihat SQL yang dijalankan Migrasi Code First.

  • Jalankan perintah Update-Database –Verbose di Konsol Manajer Paket.

Menambahkan Migrasi Berbasis Kode

Sekarang mari kita lihat sesuatu yang mungkin ingin kita gunakan migrasi berbasis kode.

  • Mari kita tambahkan properti Peringkat ke kelas Blog
    public int Rating { get; set; }

Kita hanya bisa menjalankan Update-Database untuk mendorong perubahan ini ke database. Namun, kami menambahkan kolom Blogs.Rating yang tidak dapat diubah ke null, jika ada data yang ada dalam tabel, itu akan diberi default CLR dari jenis data untuk kolom baru (Peringkat adalah bilangan bulat, sehingga akan menjadi 0). Tetapi kita ingin menentukan nilai default 3 sehingga baris yang ada dalam tabel Blog akan dimulai dengan peringkat yang layak. Mari kita gunakan perintah Add-Migration untuk menulis perubahan ini ke migrasi berbasis kode sehingga kita dapat mengeditnya. Perintah Add-Migration memungkinkan kita untuk memberi nama migrasi ini, mari kita panggil AddBlogRating kita.

  • Jalankan perintah Add-Migration AddBlogRating di Package Manager Console.
  • Di folder Migrasi, kita sekarang memiliki migrasi AddBlogRating baru. Nama file migrasi telah diperbaiki sebelumnya dengan tanda waktu untuk membantu pemesanan. Mari kita edit kode yang dihasilkan untuk menentukan nilai default 3 untuk Blog.Rating (Baris 10 dalam kode di bawah)

Migrasi juga memiliki file code-behind yang mengambil beberapa metadata. Metadata ini akan memungkinkan Migrasi Pertama Kode untuk mereplikasi migrasi otomatis yang kami lakukan sebelum migrasi berbasis kode ini. Ini penting jika pengembang lain ingin menjalankan migrasi kami atau kapan saatnya untuk menyebarkan aplikasi kami.

    namespace MigrationsAutomaticDemo.Migrations
    {
        using System;
        using System.Data.Entity.Migrations;

        public partial class AddBlogRating : DbMigration
        {
            public override void Up()
            {
                AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
            }

            public override void Down()
            {
                DropColumn("Blogs", "Rating");
            }
        }
    }

Migrasi yang diedit terlihat bagus, jadi mari gunakan Update-Database untuk memperbarui database.

  • Jalankan perintah Update-Database di Package Manager Console.

Kembali ke Migrasi Otomatis

Kami sekarang bebas untuk beralih kembali ke migrasi otomatis untuk perubahan kami yang lebih sederhana. Migrasi Pertama Kode akan mengurus melakukan migrasi otomatis dan berbasis kode dalam urutan yang benar berdasarkan metadata yang disimpan dalam file code-behind untuk setiap migrasi berbasis kode.

  • Mari kita tambahkan properti Post.Abstract ke model kita
    public string Abstract { get; set; }

Sekarang kita dapat menggunakan Update-Database untuk mendapatkan Migrasi Pertama Kode untuk mendorong perubahan ini ke database menggunakan migrasi otomatis.

  • Jalankan perintah Update-Database di Package Manager Console.

Ringkasan

Dalam panduan ini Anda melihat cara menggunakan migrasi otomatis untuk mendorong perubahan model ke database. Anda juga melihat cara membuat perancah dan menjalankan migrasi berbasis kode di antara migrasi otomatis saat Anda membutuhkan lebih banyak kontrol.