Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
Navigasi kembali ke Penjelajah Solusi. Klik kanan pada file Movies.mdf dan pilih Hapus untuk menghapus database film.
Buat aplikasi untuk memastikan tidak ada kesalahan.
Dari menu Alat, klik Pengelola Paket NuGet lalu Konsol Manajer Paket.
Di jendela Konsol Manajer Paket pada PM>
perintah masukkan "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext".
Perintah Enable-Migrations (ditunjukkan di atas) membuat file Configuration.cs di folder Migrasi baru.
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;
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.
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.
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.
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:
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:
- 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.
- 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.
- 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.)
Jalankan kembali aplikasi dan navigasikan ke URL /Movies. Anda dapat melihat bidang Peringkat baru.
Klik tautan Buat Baru untuk menambahkan film baru. Perhatikan bahwa Anda dapat menambahkan peringkat.
Klik Buat. Film baru, termasuk peringkat, sekarang muncul di daftar film:
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.