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 menggunakan versi terbaru Visual Studio. Tutorial baru menggunakan ASP.NET Core MVC, yang memberikan banyak peningkatan atas tutorial ini.
Tutorial ini mengajarkan ASP.NET Core MVC dengan pengontrol dan tampilan. Razor Pages adalah alternatif baru dalam ASP.NET Core, model pemrograman berbasis halaman yang membuat membangun UI web lebih mudah dan lebih produktif. Kami sarankan Anda mencoba tutorial Razor Pages sebelum versi MVC. Tutorial Halaman Razor:
- Lebih mudah diikuti.
- Mencakup lebih banyak fitur.
- Adalah pendekatan yang disukai untuk pengembangan aplikasi baru.
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
Navigasi ke Penjelajah Solusi. Klik kanan pada file Movies.mdf dan pilih Hapus untuk menghapus database film. Jika Anda tidak melihat file Movies.mdf, klik ikon Perlihatkan Semua File yang ditunjukkan di bawah ini di kerangka merah.

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
}
);
}
Arahkan mouse ke atas garis berlekuk merah di bawah Movie dan klik Show Potential Fixes lalu klik menggunakan 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.
Metode AddOrUpdate dalam kode berikut melakukan operasi "upsert":
context.Movies.AddOrUpdate(i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "PG",
Price = 7.99M
}
Karena metode Seed berjalan dengan setiap migrasi, Anda tidak bisa hanya menyisipkan data, karena baris yang coba Anda tambahkan sudah ada setelah migrasi pertama yang membuat database. Operasi "upsert" mencegah kesalahan yang akan terjadi jika Anda mencoba menyisipkan baris yang sudah ada, tetapi mengganti perubahan apa pun pada data yang mungkin telah Anda buat saat menguji aplikasi. Dengan data pengujian dalam beberapa tabel, Anda mungkin tidak ingin hal itu terjadi: dalam beberapa kasus saat Anda mengubah data saat menguji perubahan yang Anda inginkan tetap ada setelah pembaruan database. Dalam hal ini Anda ingin melakukan operasi penyisipan kondisional: sisipkan baris hanya jika belum ada.
Parameter pertama yang diteruskan ke metode AddOrUpdate menentukan properti yang akan digunakan untuk memeriksa apakah baris sudah ada. Untuk data film uji yang Anda sediakan, Title properti dapat digunakan untuk tujuan ini karena setiap judul dalam daftar unik:
context.Movies.AddOrUpdate(i => i.Title,
Kode ini mengasumsikan bahwa judul unik. Jika Anda menambahkan judul duplikat secara manual, Anda akan mendapatkan pengecualian berikut saat berikutnya Anda melakukan migrasi.
Urutan berisi lebih dari satu elemen
Untuk informasi selengkapnya tentang metode AddOrUpdate , lihat Berhati-hatilah dengan Metode AddOrUpdate EF 4.3..
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 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 Movies tabel 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 jalankan Seed metode .

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). Jika Anda masih mendapatkan kesalahan, buka SQL Server Object Explorer dan hapus database dari daftar. Jika Anda mendapatkan kesalahan yang menunjukkan "Tidak dapat melampirkan file .mdf sebagai database", hapus properti Katalog Awal sebagai bagian dari string koneksi dalam file web.config.
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; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Buat aplikasi (Ctrl+Shift+B).
Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda juga perlu memperbarui daftar izin pengikatan sehingga properti baru ini akan disertakan. bind Perbarui atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :
[Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")]
Anda juga perlu memperbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di 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")
@using (Html.BeginForm("Index", "Movies", FormMethod.Get))
{
<p>
Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" />
</p>
}
</p>
<table class="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 Rating bidang dengan markup yang disorot berikut. Ini merender kotak teks sehingga Anda dapat menentukan peringkat saat film baru dibuat.
<div class="form-group">
@Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Rating, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Rating, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Anda sekarang telah memperbarui kode aplikasi untuk mendukung properti baru Rating .
Jalankan aplikasi dan navigasikan ke URL /Movies . Namun, ketika Anda melakukan ini, Anda akan melihat salah satu kesalahan berikut:

Model yang mendukung konteks 'MovieDBContext' telah berubah sejak database dibuat. Pertimbangkan untuk menggunakan Migrasi Pertama Kode untuk memperbarui database (https://go.microsoft.com/fwlink/?LinkId=238269).

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 di awal siklus pengembangan ketika Anda 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 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 = "PG",
Price = 7.99M
},
Bangun solusi, lalu buka jendela Konsol Manajer Paket dan masukkan perintah berikut:
add-migration Rating
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. Nama Peringkat bersifat arbitrer 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 update-database perintah di jendela Konsol Manajer Paket.
Gambar berikut menunjukkan output di jendela Konsol Manajer Paket (Peringkat prepending stempel tanggal 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:

Sekarang setelah proyek menggunakan migrasi, Anda tidak perlu menghilangkan database saat menambahkan bidang baru atau memperbarui skema. Di bagian berikutnya, kita akan membuat lebih banyak perubahan skema dan menggunakan migrasi untuk memperbarui database.
Anda juga harus menambahkan bidang ke Rating templat tampilan Edit, Detail, dan Hapus.
Anda dapat memasukkan perintah "update-database" di jendela Package Manager Console lagi dan tidak ada kode migrasi yang akan berjalan, karena skema cocok dengan model. Namun, menjalankan "update-database" akan menjalankan Seed metode lagi, dan jika Anda mengubah salah satu data Seed, perubahan akan hilang karena Seed metode meningkatkan data. Anda dapat membaca selengkapnya tentang Seed metode dalam tutorial Tom Dykstra yang populer ASP.NET MVC/Entity Framework.
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. Ini hanya pengantar cepat untuk Kode Pertama, lihat Membuat Model Data Kerangka Kerja Entitas untuk Aplikasi MVC ASP.NET untuk tutorial yang lebih lengkap tentang subjek. Selanjutnya, mari kita lihat bagaimana Anda dapat menambahkan logika validasi yang lebih kaya ke kelas model dan memungkinkan beberapa aturan bisnis diberlakukan.