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 Code First Migrations sebelum melanjutkan.

Rekomendasi untuk Lingkungan Tim

Anda dapat mencampur migrasi otomatis dan berbasis kode tetapi ini tidak disarankan pada 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
    • Peralatan –> 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 Pertama Kode untuk memperbarui database (http://go.microsoft.com/fwlink/?LinkId=238269).

Seperti yang disarankan oleh pengecualian, saatnya mulai menggunakan Code First Migrations. 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 membuat Code First Migrations mendorong perubahan ke model kita (properti Blog.Url baru) ke dalam 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 lakukan perubahan lain dan biarkan Code First Migrations secara otomatis menerapkan 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, tentukan opsi –Verbose agar Anda dapat melihat SQL yang dijalankan oleh Code First Migrations.

  • 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 bernilai null, jika ada data yang ada dalam tabel, itu akan diberi default CLR dari tipe data untuk kolom baru (Peringkat adalah bilangan bulat, maka 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 memberikan nama pada migrasi ini, sebut saja AddBlogRating.

  • Jalankan perintah Add-Migration AddBlogRating di Package Manager Console.
  • Di folder Migrasi, kita sekarang memiliki migrasi AddBlogRating baru. Nama file migrasi diawali dengan tanda waktu untuk membantu pengurutan. 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 merekam metadata. Metadata ini akan memungkinkan Code First Migrations untuk mereplikasi migrasi otomatis yang sebelumnya kami lakukan sebelum migrasi yang 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. Code First Migrations akan menangani pelaksanaan migrasi otomatis dan berbasis kode dalam urutan yang benar berdasarkan metadata yang disimpannya 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 menjalankan Migrasi Code First agar perubahan ini diterapkan 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 scaffolding dan menjalankan migrasi berbasis kode di antara migrasi otomatis ketika Anda memerlukan kontrol lebih.