Bagikan melalui


Menambahkan Bidang Baru ke Model film dan Tabel

oleh Rick Anderson

Catatan

Versi terbaru dari tutorial ini tersedia di sini yang menggunakan ASP.NET MVC 5 dan Visual Studio 2013. Lebih aman, jauh lebih mudah untuk diikuti dan menunjukkan lebih banyak fitur.

Di bagian ini Anda akan menggunakan Migrasi Pertama Kode Kerangka Kerja Entitas untuk memigrasikan beberapa perubahan ke kelas model sehingga perubahan diterapkan ke database.

Secara default, ketika Anda menggunakan Kode Kerangka Kerja Entitas Pertama untuk membuat database secara otomatis, seperti yang Anda lakukan sebelumnya dalam tutorial ini, Code First menambahkan tabel ke database untuk membantu melacak apakah skema database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, Kerangka Kerja Entitas akan melemparkan kesalahan. Ini memudahkan untuk melacak masalah pada waktu pengembangan yang mungkin hanya Anda temukan (dengan kesalahan yang tidak jelas) pada waktu proses.

Menyiapkan Migrasi Pertama Kode untuk Perubahan Model

Jika Anda menggunakan Visual Studio 2012, klik dua kali file Movies.mdf dari Penjelajah Solusi untuk membuka alat database. Visual Studio Express untuk Web akan menampilkan Database Explorer, Visual Studio 2012 akan menampilkan Server Explorer. Jika Anda menggunakan Visual Studio 2010, gunakan SQL Server Object Explorer.

Di alat database (Database Explorer, Server Explorer, atau SQL Server Object Explorer), klik MovieDBContext kanan dan pilih Hapus untuk menghilangkan database film.

Cuplikan layar yang memperlihatkan jendela Server Explorer. Hapus dipilih di menu klik kanan Konteks Movie D B.

Navigasi kembali ke Penjelajah Solusi. Klik kanan pada file Movies.mdf dan pilih Hapus untuk menghapus database film.

Cuplikan layar yang memperlihatkan jendela Penjelajah Solusi. Hapus dipilih di menu klik kanan Movies dot m d f.

Buat aplikasi untuk memastikan tidak ada kesalahan.

Dari menu Alat, klik Pengelola Paket NuGet lalu Konsol Manajer Paket.

Tambahkan Pack Man

Di jendela Konsol Manajer Paket pada PM> perintah masukkan "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext".

Cuplikan layar yang memperlihatkan jendela Konsol Manajer Paket. Perintah Aktifkan Migrasi dimasukkan.

Perintah Enable-Migrations (ditunjukkan di atas) membuat file Configuration.cs di folder Migrasi baru.

Cuplikan layar yang memperlihatkan jendela Penjelajah Solusi. Folder Migrasi dan file Configuration dot c s dilingkari dengan warna merah.

Visual Studio membuka file Configuration.cs . Seed Ganti metode dalam file Configuration.cs dengan kode berikut:

protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
    context.Movies.AddOrUpdate( i => i.Title,
        new Movie
        {
            Title = "When Harry Met Sally",
            ReleaseDate = DateTime.Parse("1989-1-11"),
            Genre = "Romantic Comedy",
            Price = 7.99M
        },

         new Movie
         {
             Title = "Ghostbusters ",
             ReleaseDate = DateTime.Parse("1984-3-13"),
             Genre = "Comedy",
             Price = 8.99M
         },

         new Movie
         {
             Title = "Ghostbusters 2",
             ReleaseDate = DateTime.Parse("1986-2-23"),
             Genre = "Comedy",
             Price = 9.99M
         },

       new Movie
       {
           Title = "Rio Bravo",
           ReleaseDate = DateTime.Parse("1959-4-15"),
           Genre = "Western",
           Price = 3.99M
       }
   );
   
}

Klik kanan pada garis berlekuk merah di bawah Movie dan pilih Atasi lalu gunakan MvcMovie.Models;

Cuplikan layar yang memperlihatkan Atasi dipilih di menu Klik kanan Film.

Melakukannya menambahkan pernyataan penggunaan berikut:

using MvcMovie.Models;

Catatan

Migrasi Pertama Kode memanggil Seed metode setelah setiap migrasi (yaitu, memanggil update-database di Package Manager Console), dan metode ini memperbarui baris yang telah dimasukkan, atau menyisipkannya jika belum ada.

Tekan CTRL-SHIFT-B untuk membangun proyek.(Langkah-langkah berikut akan gagal jika Anda tidak membangun pada saat ini.)

Langkah selanjutnya adalah membuat DbMigration kelas untuk migrasi awal. Migrasi ini untuk membuat database baru, itulah sebabnya Anda menghapus file movie.mdf di langkah sebelumnya.

Di jendela Konsol Manajer Paket, masukkan perintah "add-migration Initial" untuk membuat migrasi awal. Nama "Inisial" bersifat arbitrer dan digunakan untuk memberi nama file migrasi yang dibuat.

Cuplikan layar yang memperlihatkan jendela Konsol Manajer Paket. Paragraf yang dimulai dengan Kode Desainer untuk file migrasi ini disorot.

Migrasi Pertama Kode membuat file kelas lain di folder Migrasi (dengan nama {DateStamp}_Initial.cs ), dan kelas ini berisi kode yang membuat skema database. Nama file migrasi telah diperbaiki sebelumnya dengan tanda waktu untuk membantu pemesanan. Periksa file {DateStamp}_Initial.cs, berisi instruksi untuk membuat tabel Film untuk Movie DB. Saat Anda memperbarui database dalam instruksi di bawah ini, file {DateStamp}_Initial.cs ini akan berjalan dan membuat skema DB. Kemudian metode Seed akan berjalan untuk mengisi DB dengan data pengujian.

Di Konsol Manajer Paket, masukkan perintah "update-database" untuk membuat database dan menjalankan metode Seed.

Cuplikan layar yang memperlihatkan jendela Konsol Manajer Paket. Perintah perbarui database dimasukkan.

Jika Anda mendapatkan kesalahan yang menunjukkan tabel sudah ada dan tidak dapat dibuat, itu mungkin karena Anda menjalankan aplikasi setelah Anda menghapus database dan sebelum Anda menjalankan update-database. Dalam hal ini, hapus file Movies.mdf lagi dan coba update-database lagi perintah . Jika Anda masih mendapatkan kesalahan, hapus folder dan konten migrasi, lalu mulai dengan instruksi di bagian atas halaman ini (yang menghapus file Movies.mdf lalu lanjutkan ke Enable-Migrations).

Jalankan aplikasi dan navigasikan ke URL /Movies . Data benih ditampilkan.

Cuplikan layar yang memperlihatkan halaman Indeks Film M V C dengan daftar empat film.

Menambahkan Properti Peringkat ke Model Film

Mulailah dengan menambahkan properti baru Rating ke kelas yang Movie sudah ada. Buka file Models\Movie.cs dan tambahkan Rating properti seperti ini:

public string Rating { get; set; }

Kelas lengkap Movie sekarang terlihat seperti kode berikut:

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

Buat aplikasi menggunakan perintah menu Build>Build Movie atau dengan menekan CTRL-SHIFT-B.

Setelah memperbarui Model kelas, Anda juga perlu memperbarui templat tampilan \Views\Movies\Index.cshtml dan \Views\Movies\Create.cshtml untuk menampilkan properti baru Rating dalam tampilan browser.

Buka file\Views\Movies\Index.cshtml dan tambahkan <th>Rating</th> judul kolom tepat setelah kolom Harga. Kemudian tambahkan <td> kolom di dekat akhir templat untuk merender @item.Rating nilai. Di bawah ini adalah seperti apa templat tampilan Index.cshtml yang diperbarui:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
         <th>
            @Html.DisplayNameFor(model => model.Rating)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Rating)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

Selanjutnya, buka file \Views\Movies\Create.cshtml dan tambahkan markup berikut di dekat akhir formulir. Ini merender kotak teks sehingga Anda dapat menentukan peringkat saat film baru dibuat.

<div class="editor-label">
    @Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)
</div>

Anda sekarang telah memperbarui kode aplikasi untuk mendukung properti baru Rating .

Sekarang jalankan aplikasi dan navigasikan ke URL /Movies . Namun, ketika Anda melakukan ini, Anda akan melihat salah satu kesalahan berikut:

Cuplikan layar yang memperlihatkan kesalahan Pengecualian Operasi Tidak Valid tidak ditangani oleh kode pengguna.

Cuplikan layar yang memperlihatkan jendela browser dengan kesalahan yang menyatakan Kesalahan Server di Aplikasi.

Anda melihat kesalahan ini karena kelas model yang diperbarui Movie dalam aplikasi sekarang berbeda dari Movie skema tabel database yang ada. (Tidak ada Rating kolom dalam tabel database.)

Ada beberapa pendekatan untuk mengatasi kesalahan:

  1. Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database berdasarkan skema kelas model baru. Pendekatan ini sangat nyaman ketika melakukan pengembangan aktif pada database pengujian; ini memungkinkan Anda untuk dengan cepat mengembangkan model dan skema database bersama-sama. Namun, kelemahannya adalah Anda kehilangan data yang ada dalam database — sehingga Anda tidak ingin menggunakan pendekatan ini pada database produksi! Menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi. Untuk informasi selengkapnya tentang penginisialisasi database Entity Framework, lihat tutorial Tom Dykstra ASP.NET MVC/Entity Framework.
  2. Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah Anda menyimpan data Anda. Anda dapat membuat perubahan ini secara manual atau dengan membuat skrip perubahan database.
  3. Gunakan Migrasi Pertama Kode untuk memperbarui skema database.

Untuk tutorial ini, kita akan menggunakan Migrasi Pertama Kode.

Perbarui metode Seed sehingga memberikan nilai untuk kolom baru. Buka file Migrations\Configuration.cs dan tambahkan bidang Peringkat ke setiap objek Film.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "G",
    Price = 7.99M
},

Bangun solusi, lalu buka jendela Konsol Manajer Paket dan masukkan perintah berikut:

add-migration AddRatingMig

Perintah memberi add-migration tahu kerangka kerja migrasi untuk memeriksa model film saat ini dengan skema DB film saat ini dan membuat kode yang diperlukan untuk memigrasikan DB ke model baru. AddRatingMig bersifat sewenang-wenang dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk langkah migrasi.

Setelah perintah ini selesai, Visual Studio membuka file kelas yang menentukan kelas turunan baru DbMigration , dan dalam metode Anda Up dapat melihat kode yang membuat kolom baru.

public partial class AddRatingMig : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Movies", "Rating", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("dbo.Movies", "Rating");
    }
}

Bangun solusi, lalu masukkan perintah "update-database" di jendela Package Manager Console .

Gambar berikut menunjukkan output di jendela Konsol Manajer Paket (Pendahuluan stempel tanggal AddRatingMig akan berbeda.)

Cuplikan layar yang memperlihatkan perintah perbarui database.

Jalankan kembali aplikasi dan navigasikan ke URL /Movies. Anda dapat melihat bidang Peringkat baru.

Cuplikan layar yang memperlihatkan halaman Indeks Film M V C dengan empat film tercantum.

Klik tautan Buat Baru untuk menambahkan film baru. Perhatikan bahwa Anda dapat menambahkan peringkat.

7_CreateRioII

Klik Buat. Film baru, termasuk peringkat, sekarang muncul di daftar film:

7_ourNewMovie_SM

Anda juga harus menambahkan bidang ke Rating templat tampilan Edit, Detail, dan SearchIndex.

Anda dapat memasukkan perintah "update-database" di jendela Package Manager Console lagi dan tidak ada perubahan yang akan dilakukan, karena skema cocok dengan model.

Di bagian ini Anda melihat bagaimana Anda dapat memodifikasi objek model dan menjaga database tetap sinkron dengan perubahan. Anda juga mempelajari cara mengisi database yang baru dibuat dengan data sampel sehingga Anda dapat mencoba skenario. Selanjutnya, mari kita lihat bagaimana Anda dapat menambahkan logika validasi yang lebih kaya ke kelas model dan memungkinkan beberapa aturan bisnis diberlakukan.