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

  1. Models/Movie.cs Buka file dan tambahkan Rating 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;
    }
    
  2. Edit Pages/Movies/Index.cshtml, dan tambahkan Rating 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>
    
  3. 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:

  1. 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.
  2. 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.
  3. 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

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

  2. Di PMC, masukkan perintah berikut:

    Add-Migration Rating
    Update-Database
    

Perintah Add-Migration memberi tahu kerangka kerja untuk:

  • Bandingkan Movie model dengan Movie 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:

  1. Pilih database di SSOX.

  2. Klik kanan pada database, dan pilih Hapus.

  3. Centang Tutup koneksi yang sudah ada.

  4. Pilih OK.

  5. 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

  1. Models/Movie.cs Buka file dan tambahkan Rating 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;
    }
    
  2. Edit Pages/Movies/Index.cshtml, dan tambahkan Rating 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>
    
  3. 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:

  1. 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.
  2. 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.
  3. 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

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

  2. Di PMC, masukkan perintah berikut:

    Add-Migration Rating
    Update-Database
    

Perintah Add-Migration memberi tahu kerangka kerja untuk:

  • Bandingkan Movie model dengan Movie 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:

  1. Pilih database di SSOX.

  2. Klik kanan pada database, dan pilih Hapus.

  3. Centang Tutup koneksi yang sudah ada.

  4. Pilih OK.

  5. 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

  1. Models/Movie.cs Buka file dan tambahkan Rating 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;
    }
    
  2. Edit Pages/Movies/Index.cshtml, dan tambahkan Rating 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>
    
  3. 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:

  1. 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.
  2. 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.
  3. 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

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

  2. Di PMC, masukkan perintah berikut:

    Add-Migration Rating
    Update-Database
    

Perintah Add-Migration memberi tahu kerangka kerja untuk:

  • Bandingkan Movie model dengan Movie 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:

  1. Pilih database di SSOX.

  2. Klik kanan pada database, dan pilih Hapus.

  3. Centang Tutup koneksi yang sudah ada.

  4. Pilih OK.

  5. 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

  1. Models/Movie.cs Buka file dan tambahkan Rating 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; }
    }
    
  2. Buat aplikasi.

  3. Edit Pages/Movies/Index.cshtml, dan tambahkan Rating 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>
    
  4. 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:

  1. 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.

  2. 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.

  3. 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

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

  2. Di PMC, masukkan perintah berikut:

    Add-Migration Rating
    Update-Database
    

Perintah Add-Migration memberi tahu kerangka kerja untuk:

  • Bandingkan Movie model dengan Movie 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:

  1. Pilih database di SSOX.

  2. Klik kanan pada database, dan pilih Hapus.

  3. Centang Tutup koneksi yang sudah ada.

  4. Pilih OK.

  5. 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

  1. Models/Movie.cs Buka file dan tambahkan Rating 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; }
    }
    
  2. Buat aplikasi.

  3. Edit Pages/Movies/Index.cshtml, dan tambahkan Rating 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>
    
  4. 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:

  1. 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.

  2. 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.

  3. 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

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

  2. Di PMC, masukkan perintah berikut:

    Add-Migration Rating
    Update-Database
    

Perintah Add-Migration memberi tahu kerangka kerja untuk:

  • Bandingkan Movie model dengan Movie 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