Bagian 7, tambahkan bidang baru ke Razor Halaman di ASP.NET Core
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Oleh Rick Anderson
Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:
- Tambahkan bidang baru ke model.
- Migrasikan perubahan skema bidang baru ke database.
Saat menggunakan Kode EF Terlebih Dahulu untuk membuat dan melacak database secara otomatis, Kode Pertama:
__EFMigrationsHistory
Menambahkan tabel ke database untuk melacak apakah skema database sinkron dengan kelas model yang dihasilkannya.- Memberikan pengecualian jika kelas model tidak sinkron dengan database.
Verifikasi otomatis bahwa skema dan model sinkron memudahkan untuk menemukan masalah kode database yang tidak konsisten.
Menambahkan Properti Peringkat ke Model Film
Models/Movie.cs
Buka file dan tambahkanRating
properti:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Edit
Pages/Movies/Index.cshtml
, dan tambahkanRating
bidang:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <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> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
Perbarui halaman berikut dengan
Rating
bidang:
Aplikasi tidak akan berfungsi sampai database diperbarui untuk menyertakan bidang baru. Menjalankan aplikasi tanpa pembaruan ke database melempar :SqlException
SqlException: Invalid column name 'Rating'.
Pengecualian SqlException
disebabkan oleh kelas model Film yang diperbarui berbeda dari skema tabel Film database. Tidak ada Rating
kolom dalam tabel database.
Ada beberapa pendekatan untuk mengatasi kesalahan:
- Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database menggunakan skema kelas model baru. Pendekatan ini nyaman di awal siklus pengembangan, memungkinkan pengembang untuk dengan cepat mengembangkan model dan skema database bersama-sama. Kelemahannya adalah bahwa data yang ada dalam database hilang. Jangan gunakan pendekatan ini pada database produksi! Menghilangkan database pada perubahan skema dan menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi.
- Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah menyimpan data. Buat perubahan ini secara manual atau dengan membuat skrip perubahan database.
- Gunakan Migrasi Pertama Kode untuk memperbarui skema database.
Untuk tutorial ini, gunakan Migrasi Pertama Kode.
SeedData
Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi buat perubahan ini untuk setiap new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Lihat file SeedData.cs yang telah selesai.
Membangun aplikasi
Tekan Ctrl+Shift+B
Menambahkan migrasi untuk bidang peringkat
Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.
Di PMC, masukkan perintah berikut:
Add-Migration Rating Update-Database
Perintah Add-Migration
memberi tahu kerangka kerja untuk:
- Bandingkan
Movie
model denganMovie
skema database. - Buat kode untuk memigrasikan skema database ke model baru.
Nama "Peringkat" bersifat arbitrer dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk file migrasi.
Perintah Update-Database
memberi tahu kerangka kerja untuk menerapkan perubahan skema ke database dan untuk mempertahankan data yang ada.
Hapus semua rekaman dalam database, penginisialisasi akan menyemai database dan menyertakan Rating
bidang . Menghapus dapat dilakukan dengan tautan penghapusan di browser atau dari Sql Server Object Explorer (SSOX).
Opsi lain adalah menghapus database dan menggunakan migrasi untuk membuat ulang database. Untuk menghapus database di SSOX:
Pilih database di SSOX.
Klik kanan pada database, dan pilih Hapus.
Centang Tutup koneksi yang sudah ada.
Pilih OK.
Di PMC, perbarui database:
Update-Database
Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating
bidang. Jika database tidak seeded, atur titik henti dalam SeedData.Initialize
metode .
Langkah berikutnya
Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:
- Tambahkan bidang baru ke model.
- Migrasikan perubahan skema bidang baru ke database.
Saat menggunakan Kode EF Terlebih Dahulu untuk membuat dan melacak database secara otomatis, Kode Pertama:
__EFMigrationsHistory
Menambahkan tabel ke database untuk melacak apakah skema database sinkron dengan kelas model yang dihasilkannya.- Memberikan pengecualian jika kelas model tidak sinkron dengan database.
Verifikasi otomatis bahwa skema dan model sinkron memudahkan untuk menemukan masalah kode database yang tidak konsisten.
Menambahkan Properti Peringkat ke Model Film
Models/Movie.cs
Buka file dan tambahkanRating
properti:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Edit
Pages/Movies/Index.cshtml
, dan tambahkanRating
bidang:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <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> <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> | <a asp-page="./Details" asp-route-id="@item.Id">Details</a> | <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
Perbarui halaman berikut dengan
Rating
bidang:
Aplikasi tidak akan berfungsi sampai database diperbarui untuk menyertakan bidang baru. Menjalankan aplikasi tanpa pembaruan ke database melempar :SqlException
SqlException: Invalid column name 'Rating'.
Pengecualian SqlException
disebabkan oleh kelas model Film yang diperbarui berbeda dari skema tabel Film database. Tidak ada Rating
kolom dalam tabel database.
Ada beberapa pendekatan untuk mengatasi kesalahan:
- Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database menggunakan skema kelas model baru. Pendekatan ini nyaman di awal siklus pengembangan, memungkinkan pengembang untuk dengan cepat mengembangkan model dan skema database bersama-sama. Kelemahannya adalah bahwa data yang ada dalam database hilang. Jangan gunakan pendekatan ini pada database produksi! Menghilangkan database pada perubahan skema dan menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi.
- Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah menyimpan data. Buat perubahan ini secara manual atau dengan membuat skrip perubahan database.
- Gunakan Migrasi Pertama Kode untuk memperbarui skema database.
Untuk tutorial ini, gunakan Migrasi Pertama Kode.
SeedData
Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi buat perubahan ini untuk setiap new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Lihat file SeedData.cs yang telah selesai.
Membangun aplikasi
Tekan Ctrl+Shift+B
Menambahkan migrasi untuk bidang peringkat
Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.
Di PMC, masukkan perintah berikut:
Add-Migration Rating Update-Database
Perintah Add-Migration
memberi tahu kerangka kerja untuk:
- Bandingkan
Movie
model denganMovie
skema database. - Buat kode untuk memigrasikan skema database ke model baru.
Nama "Peringkat" bersifat arbitrer dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk file migrasi.
Perintah Update-Database
memberi tahu kerangka kerja untuk menerapkan perubahan skema ke database dan untuk mempertahankan data yang ada.
Hapus semua rekaman dalam database, penginisialisasi akan menyemai database dan menyertakan Rating
bidang . Menghapus dapat dilakukan dengan tautan penghapusan di browser atau dari Sql Server Object Explorer (SSOX).
Opsi lain adalah menghapus database dan menggunakan migrasi untuk membuat ulang database. Untuk menghapus database di SSOX:
Pilih database di SSOX.
Klik kanan pada database, dan pilih Hapus.
Centang Tutup koneksi yang sudah ada.
Pilih OK.
Di PMC, perbarui database:
Update-Database
Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating
bidang. Jika database tidak seeded, atur titik henti dalam SeedData.Initialize
metode .
Langkah berikutnya
Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:
- Tambahkan bidang baru ke model.
- Migrasikan perubahan skema bidang baru ke database.
Saat menggunakan Kode EF Terlebih Dahulu untuk membuat dan melacak database secara otomatis, Kode Pertama:
__EFMigrationsHistory
Menambahkan tabel ke database untuk melacak apakah skema database sinkron dengan kelas model yang dihasilkannya.- Memberikan pengecualian jika kelas model tidak sinkron dengan database.
Verifikasi otomatis bahwa skema dan model sinkron memudahkan untuk menemukan masalah kode database yang tidak konsisten.
Menambahkan Properti Peringkat ke Model Film
Models/Movie.cs
Buka file dan tambahkanRating
properti:public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
Edit
Pages/Movies/Index.cshtml
, dan tambahkanRating
bidang:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <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> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Perbarui halaman berikut dengan
Rating
bidang:
Aplikasi tidak akan berfungsi sampai database diperbarui untuk menyertakan bidang baru. Menjalankan aplikasi tanpa pembaruan ke database melempar :SqlException
SqlException: Invalid column name 'Rating'.
Pengecualian SqlException
disebabkan oleh kelas model Film yang diperbarui berbeda dari skema tabel Film database. Tidak ada Rating
kolom dalam tabel database.
Ada beberapa pendekatan untuk mengatasi kesalahan:
- Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database menggunakan skema kelas model baru. Pendekatan ini nyaman di awal siklus pengembangan, memungkinkan pengembang untuk dengan cepat mengembangkan model dan skema database bersama-sama. Kelemahannya adalah bahwa data yang ada dalam database hilang. Jangan gunakan pendekatan ini pada database produksi! Menghilangkan database pada perubahan skema dan menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi.
- Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah menyimpan data. Buat perubahan ini secara manual atau dengan membuat skrip perubahan database.
- Gunakan Migrasi Pertama Kode untuk memperbarui skema database.
Untuk tutorial ini, gunakan Migrasi Pertama Kode.
SeedData
Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi buat perubahan ini untuk setiap new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Lihat file SeedData.cs yang telah selesai.
Bangun solusinya.
Menambahkan migrasi untuk bidang peringkat
Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.
Di PMC, masukkan perintah berikut:
Add-Migration Rating Update-Database
Perintah Add-Migration
memberi tahu kerangka kerja untuk:
- Bandingkan
Movie
model denganMovie
skema database. - Buat kode untuk memigrasikan skema database ke model baru.
Nama "Peringkat" bersifat arbitrer dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk file migrasi.
Perintah Update-Database
memberi tahu kerangka kerja untuk menerapkan perubahan skema ke database dan untuk mempertahankan data yang ada.
Hapus semua rekaman dalam database, penginisialisasi akan menyemai database dan menyertakan Rating
bidang . Menghapus dapat dilakukan dengan tautan penghapusan di browser atau dari Sql Server Object Explorer (SSOX).
Opsi lain adalah menghapus database dan menggunakan migrasi untuk membuat ulang database. Untuk menghapus database di SSOX:
Pilih database di SSOX.
Klik kanan pada database, dan pilih Hapus.
Centang Tutup koneksi yang sudah ada.
Pilih OK.
Di PMC, perbarui database:
Update-Database
Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating
bidang. Jika database tidak seeded, atur titik henti dalam SeedData.Initialize
metode .
Langkah berikutnya
Lihat atau unduh sampel kode (cara mengunduh).
Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:
- Tambahkan bidang baru ke model.
- Migrasikan perubahan skema bidang baru ke database.
Saat menggunakan Kode EF Pertama untuk membuat database secara otomatis, Kode Pertama:
__EFMigrationsHistory
Menambahkan tabel ke database untuk melacak apakah skema database sinkron dengan kelas model yang dihasilkannya.- Jika kelas model tidak sinkron dengan database, EF akan memberikan pengecualian.
Verifikasi otomatis bahwa skema dan model sinkron memudahkan untuk menemukan masalah kode database yang tidak konsisten.
Menambahkan Properti Peringkat ke Model Film
Models/Movie.cs
Buka file dan tambahkanRating
properti:public class Movie { public int ID { get; set; } public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } }
Buat aplikasi.
Edit
Pages/Movies/Index.cshtml
, dan tambahkanRating
bidang:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <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> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Perbarui halaman berikut dengan
Rating
bidang:
Aplikasi tidak akan berfungsi sampai database diperbarui untuk menyertakan bidang baru. Menjalankan aplikasi tanpa pembaruan ke database melempar :SqlException
SqlException: Invalid column name 'Rating'.
Pengecualian SqlException
disebabkan oleh kelas model Film yang diperbarui berbeda dari skema tabel Film database. Tidak ada Rating
kolom dalam tabel database.
Ada beberapa pendekatan untuk mengatasi kesalahan:
Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database menggunakan skema kelas model baru. Pendekatan ini nyaman di awal siklus pengembangan, memungkinkan Anda untuk dengan cepat mengembangkan model dan skema database bersama-sama. Kelemahannya adalah Anda kehilangan data yang ada dalam database. Jangan gunakan pendekatan ini pada database produksi! Menghilangkan database pada perubahan skema dan menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi.
Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah menyimpan data. Buat perubahan ini secara manual atau dengan membuat skrip perubahan database.
Gunakan Migrasi Pertama Kode untuk memperbarui skema database.
Untuk tutorial ini, gunakan Migrasi Pertama Kode.
SeedData
Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi buat perubahan ini untuk setiap new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Lihat file SeedData.cs yang telah selesai.
Bangun solusinya.
Menambahkan migrasi untuk bidang peringkat
Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.
Di PMC, masukkan perintah berikut:
Add-Migration Rating Update-Database
Perintah Add-Migration
memberi tahu kerangka kerja untuk:
- Bandingkan
Movie
model denganMovie
skema database. - Buat kode untuk memigrasikan skema database ke model baru.
Nama "Peringkat" bersifat arbitrer dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk file migrasi.
Perintah Update-Database
memberi tahu kerangka kerja untuk menerapkan perubahan skema ke database dan untuk mempertahankan data yang ada.
Hapus semua rekaman dalam database, penginisialisasi akan menyemai database dan menyertakan Rating
bidang . Menghapus dapat dilakukan dengan tautan penghapusan di browser atau dari Sql Server Object Explorer (SSOX).
Opsi lain adalah menghapus database dan menggunakan migrasi untuk membuat ulang database. Untuk menghapus database di SSOX:
Pilih database di SSOX.
Klik kanan pada database, dan pilih Hapus.
Centang Tutup koneksi yang sudah ada.
Pilih OK.
Di PMC, perbarui database:
Update-Database
Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat/mengedit/menampilkan film dengan Rating
bidang. Jika database tidak seeded, atur titik henti dalam SeedData.Initialize
metode .
Langkah berikutnya
Lihat atau unduh sampel kode (cara mengunduh).
Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:
- Tambahkan bidang baru ke model.
- Migrasikan perubahan skema bidang baru ke database.
Saat menggunakan Kode EF Pertama untuk membuat database secara otomatis, Kode Pertama:
__EFMigrationsHistory
Menambahkan tabel ke database untuk melacak apakah skema database sinkron dengan kelas model yang dihasilkannya.- Jika kelas model tidak sinkron dengan database, EF akan memberikan pengecualian.
Verifikasi otomatis bahwa skema dan model sinkron memudahkan untuk menemukan masalah kode database yang tidak konsisten.
Menambahkan Properti Peringkat ke Model Film
Models/Movie.cs
Buka file dan tambahkanRating
properti:public class Movie { public int ID { get; set; } public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } }
Buat aplikasi.
Edit
Pages/Movies/Index.cshtml
, dan tambahkanRating
bidang:@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movie[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Movie[0].Rating) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movie) { <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> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
Perbarui halaman berikut dengan
Rating
bidang:
Aplikasi tidak akan berfungsi sampai database diperbarui untuk menyertakan bidang baru. Menjalankan aplikasi tanpa pembaruan ke database melempar :SqlException
SqlException: Invalid column name 'Rating'.
Pengecualian SqlException
disebabkan oleh kelas model Film yang diperbarui berbeda dari skema tabel Film database. Tidak ada Rating
kolom dalam tabel database.
Ada beberapa pendekatan untuk mengatasi kesalahan:
Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database menggunakan skema kelas model baru. Pendekatan ini nyaman di awal siklus pengembangan, memungkinkan Anda untuk dengan cepat mengembangkan model dan skema database bersama-sama. Kelemahannya adalah Anda kehilangan data yang ada dalam database. Jangan gunakan pendekatan ini pada database produksi! Menghilangkan database pada perubahan skema dan menggunakan penginisialisasi untuk secara otomatis menyemai database dengan data pengujian sering kali merupakan cara produktif untuk mengembangkan aplikasi.
Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah menyimpan data. Buat perubahan ini secara manual atau dengan membuat skrip perubahan database.
Gunakan Migrasi Pertama Kode untuk memperbarui skema database.
Untuk tutorial ini, gunakan Migrasi Pertama Kode.
SeedData
Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi buat perubahan ini untuk setiap new Movie
blok.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Lihat file SeedData.cs yang telah selesai.
Bangun solusinya.
Menambahkan migrasi untuk bidang peringkat
Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.
Di PMC, masukkan perintah berikut:
Add-Migration Rating Update-Database
Perintah Add-Migration
memberi tahu kerangka kerja untuk:
- Bandingkan
Movie
model denganMovie
skema database. - Buat kode untuk memigrasikan skema database ke model baru.
Nama "Peringkat" bersifat arbitrer dan digunakan untuk memberi nama file migrasi. Sangat membantu untuk menggunakan nama yang bermakna untuk file migrasi.
Perintah Update-Database
memberi tahu kerangka kerja untuk menerapkan perubahan skema ke database dan untuk mempertahankan data yang ada.
Jika Anda menghapus semua rekaman dalam database, penginisialisasi akan menyemai database dan menyertakan Rating
bidang . Anda dapat melakukan ini dengan tautan penghapusan di browser atau dari Sql Server Object Explorer (SSOX).
Opsi lain adalah menghapus database dan menggunakan migrasi untuk membuat ulang database. Untuk menghapus database di SSOX:
Pilih database di SSOX.
Klik kanan pada database, dan pilih Hapus.
Centang Tutup koneksi yang sudah ada.
Pilih OK.
Di PMC, perbarui database:
Update-Database
Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat/mengedit/menampilkan film dengan Rating
bidang. Jika database tidak seeded, atur titik henti dalam SeedData.Initialize
metode .
Langkah berikutnya
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk