Bagikan melalui


Bagian 8, tambahkan bidang baru ke aplikasi MVC Inti ASP.NET

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.

Oleh Rick Anderson

Di bagian ini, Migrasi Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Entity Framework (EF) digunakan untuk membuat database secara otomatis dari kelas model:

  • Tabel ditambahkan ke database untuk melacak skema database.
  • Database diverifikasi agar sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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; }
}

Membangun aplikasi

Tekan Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Rating Tambahkan properti ke templat tampilan , , Create.cshtmlDelete.cshtml, dan Details.cshtml yang tersisaEdit.cshtml.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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 Kerangka Kerja Entitas untuk memperbarui skema database.

Untuk tutorial ini, Migrasi Kerangka Kerja Entitas digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di Package Manager Console, masukkan perintah berikut:

Add-Migration Rating

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Di Package Manager Console, masukkan perintah berikut:

Update-Database

Perintah Update-Database menjalankan metode Up dalam migrasi yang belum diterapkan.

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.

Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Kode EF Pertama digunakan untuk membuat database secara otomatis, Kode Pertama:

  • Menambahkan tabel ke database untuk melacak skema database.
  • Memverifikasi database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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; }
}

Membangun aplikasi

Tekan Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Perbarui templat yang tersisa.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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, Migrasi Pertama Kode digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration Rating
Update-Database

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.

Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Kode EF Pertama digunakan untuk membuat database secara otomatis, Kode Pertama:

  • Menambahkan tabel ke database untuk melacak skema database.
  • Memverifikasi database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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; }
}

Membangun aplikasi

Tekan Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies![0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Perbarui templat yang tersisa.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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, Migrasi Pertama Kode digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration Rating
Update-Database

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.

Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Kode EF Pertama digunakan untuk membuat database secara otomatis, Kode Pertama:

  • Menambahkan tabel ke database untuk melacak skema database.
  • Memverifikasi database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Membangun aplikasi

Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies[0].Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies)
        {
            <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-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Perbarui templat yang tersisa.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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, Migrasi Pertama Kode digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration Rating
Update-Database

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.

Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Kode EF Pertama digunakan untuk membuat database secara otomatis, Kode Pertama:

  • Menambahkan tabel ke database untuk melacak skema database.
  • Memverifikasi database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Membangun aplikasi

Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Rating)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model.Movies)
    {
        <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>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Perbarui templat yang tersisa.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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, Migrasi Pertama Kode digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration Rating
Update-Database

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.

Di bagian ini, Migrasi Pertama Kode Kerangka Kerja Entitas digunakan untuk:

  • Tambahkan bidang baru ke model.
  • Migrasikan bidang baru ke database.

Ketika Kode EF Pertama digunakan untuk membuat database secara otomatis, Kode Pertama:

  • Menambahkan tabel ke database untuk melacak skema database.
  • Memverifikasi database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, EF akan memberikan pengecualian. Ini memudahkan untuk menemukan masalah database/kode yang tidak konsisten.

Menambahkan Properti Peringkat ke Model Film

Rating Tambahkan properti ke Models/Movie.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Membangun aplikasi

Ctrl+Shift+B

Karena Anda telah menambahkan bidang baru ke Movie kelas , Anda perlu memperbarui daftar pengikatan properti sehingga properti baru ini akan disertakan. Di MoviesController.cs, perbarui [Bind] atribut untuk Create metode tindakan dan Edit untuk menyertakan Rating properti :

[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]

Perbarui templat tampilan untuk menampilkan, membuat, dan mengedit properti baru Rating di tampilan browser.

/Views/Movies/Index.cshtml Edit file dan tambahkan Rating bidang:

<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Movies[0].Rating)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model.Movies)
    {
        <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>

/Views/Movies/Create.cshtml Perbarui dengan Rating bidang.

Anda dapat menyalin/menempelkan "grup formulir" sebelumnya dan membiarkan intelliSense membantu Anda memperbarui bidang. IntelliSense berfungsi dengan Pembantu Tag.

Pengembang telah mengetik huruf R untuk nilai atribut asp-for dalam elemen label kedua tampilan. Menu kontekstual Intellisense telah muncul memperlihatkan bidang yang tersedia, termasuk Peringkat, yang disorot dalam daftar secara otomatis. Saat pengembang mengklik bidang atau menekan Enter pada keyboard, nilai akan diatur ke Peringkat.

Perbarui templat yang tersisa.

SeedData Perbarui kelas sehingga memberikan nilai untuk kolom baru. Perubahan sampel ditunjukkan di bawah ini, tetapi Anda harus membuat perubahan ini untuk setiap new Movie.

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

Aplikasi tidak akan berfungsi hingga DB diperbarui untuk menyertakan bidang baru. Jika dijalankan sekarang, berikut ini SqlException dilemparkan:

SqlException: Invalid column name 'Rating'.

Kesalahan ini terjadi karena kelas model Film yang diperbarui berbeda dari skema tabel Film dari 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 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. Ini adalah pendekatan yang baik untuk pengembangan dini dan saat menggunakan SQLite.

  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, Migrasi Pertama Kode digunakan.

Dari menu Alat , pilih NuGet Package Manager > Package Manager Console.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration Rating
Update-Database

Perintah memberi Add-Migration tahu kerangka kerja migrasi untuk memeriksa model saat ini Movie dengan skema DB saat ini Movie 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 file migrasi.

Jika semua rekaman dalam DB dihapus, metode inisialisasi akan menyemai DB dan menyertakan Rating bidang .

Jalankan aplikasi dan verifikasi bahwa Anda dapat membuat, mengedit, dan menampilkan film dengan Rating bidang.