將新字段添加到 ASP.NET Core 中的 Razor 頁面

2019-04-17 08:57 更新

查看或下載示例代碼如何下載)。

在此部分中,Entity Framework Code First 遷移用于:

  • 將新字段添加到模型。
  • 將新字段架構(gòu)更改遷移到數(shù)據(jù)庫。

使用 EF Code First 自動(dòng)創(chuàng)建數(shù)據(jù)庫時(shí),Code First 將:

  • 向數(shù)據(jù)庫添加表格,以跟蹤數(shù)據(jù)庫的架構(gòu)是否與從生成它的模型類同步。
  • 如果該模型類未與數(shù)據(jù)庫同步,EF 將引發(fā)異常。

通過自動(dòng)驗(yàn)證同步的架構(gòu)/模型可以更容易地發(fā)現(xiàn)不一致的數(shù)據(jù)庫/代碼問題。

向電影模型添加分級(jí)屬性

打開 Models/Movie.cs 文件,并添加 Rating 屬性:

C#

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

構(gòu)建應(yīng)用程序。

編輯 Pages/Movies/Index.cshtml,并添加 Rating 字段:

CSHTML

@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>

更新以下頁面:

  • 將 Rating 字段添加到“刪除”和“詳細(xì)信息”頁面。
  • 使用 Rating 字段更新 Create.cshtml
  • 將 Rating 字段添加到“編輯”頁面。

在 DB 更新為包括新字段之前,應(yīng)用將不會(huì)正常工作。 如果立即運(yùn)行,應(yīng)用會(huì)引發(fā) SqlException:

SqlException: Invalid column name 'Rating'.

此錯(cuò)誤是由于更新的 Movie 模型類與數(shù)據(jù)庫的 Movie 表架構(gòu)不同導(dǎo)致的。 (數(shù)據(jù)庫表中沒有 Rating 列。)

可通過幾種方法解決此錯(cuò)誤:

  1. 讓 Entity Framework 自動(dòng)丟棄并使用新的模型類架構(gòu)重新創(chuàng)建數(shù)據(jù)庫。 此方法在開發(fā)周期早期很方便;通過它可以一起快速改進(jìn)模型和數(shù)據(jù)庫架構(gòu)。 此方法的缺點(diǎn)是會(huì)導(dǎo)致數(shù)據(jù)庫中的現(xiàn)有數(shù)據(jù)丟失。 請(qǐng)勿對(duì)生產(chǎn)數(shù)據(jù)庫使用此方法! 當(dāng)架構(gòu)更改時(shí)丟棄數(shù)據(jù)庫并使用初始值設(shè)定項(xiàng)以使用測(cè)試數(shù)據(jù)自動(dòng)設(shè)定數(shù)據(jù)庫種子,這通常是開發(fā)應(yīng)用的有效方式。
  2. 對(duì)現(xiàn)有數(shù)據(jù)庫架構(gòu)進(jìn)行顯式修改,使它與模型類相匹配。 此方法的優(yōu)點(diǎn)是可以保留數(shù)據(jù)。 可以手動(dòng)或通過創(chuàng)建數(shù)據(jù)庫更改腳本進(jìn)行此更改。
  3. 使用 Code First 遷移更新數(shù)據(jù)庫架構(gòu)。

對(duì)于本教程,請(qǐng)使用 Code First 遷移。

更新 SeedData 類,使它提供新列的值。 示例更改如下所示,但可能需要對(duì)每個(gè) new Movie 塊做出此更改。

C#

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

請(qǐng)參閱已完成的 SeedData.cs 文件。

生成解決方案。

添加用于評(píng)級(jí)字段的遷移

從“工具”菜單中,選擇“NuGet 包管理器”>“包管理器控制臺(tái)”。 在 PMC 中,輸入以下命令:

PowerShell
Add-Migration Rating
Update-Database

Add-Migration 命令會(huì)通知框架執(zhí)行以下操作:

  • 將 Movie 模型與 Movie DB 架構(gòu)進(jìn)行比較。
  • 創(chuàng)建代碼以將 DB 架構(gòu)遷移到新模型。

名稱“Rating”是任意的,用于對(duì)遷移文件進(jìn)行命名。 為遷移文件使用有意義的名稱是有幫助的。

Update-Database 命令指示框架將架構(gòu)更改應(yīng)用到數(shù)據(jù)庫。

如果刪除 DB 中的所有記錄,種子初始值設(shè)定項(xiàng)會(huì)設(shè)定 DB 種子,并將包括 Rating 字段。 可以使用瀏覽器中的刪除鏈接,也可以從 Sql Server 對(duì)象資源管理器 (SSOX) 執(zhí)行此操作。

另一個(gè)方案是刪除數(shù)據(jù)庫,并使用遷移來重新創(chuàng)建該數(shù)據(jù)庫。 刪除 SSOX 中的數(shù)據(jù)庫:

  • 在 SSOX 中選擇數(shù)據(jù)庫。

  • 右鍵單擊數(shù)據(jù)庫,并選擇“刪除”。

  • 檢查“關(guān)閉現(xiàn)有連接”。

  • 選擇“確定”。

  • 在 PMC 中更新數(shù)據(jù)庫:

    PowerShell
    Update-Database
    

運(yùn)行應(yīng)用,并驗(yàn)證是否可以創(chuàng)建/編輯/顯示具有 Rating 字段的電影。 如果數(shù)據(jù)庫未設(shè)定種子,則在 SeedData.Initialize 方法中設(shè)置斷點(diǎn)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)