將新字段添加到 ASP.NET Core MVC 應(yīng)用

2021-06-15 15:35 更新

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

  • 將新字段添加到模型。
  • 將新字段遷移到數(shù)據(jù)庫。

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

  • 將表添加到數(shù)據(jù)庫,以跟蹤數(shù)據(jù)庫的架構(gòu)。
  • 驗(yàn)證數(shù)據(jù)庫與生成它的模型類是否同步。 如果它們不同步,EF 則會引發(fā)異常。 這使查找不一致的數(shù)據(jù)庫/代碼問題變得更加輕松。

向電影模型添加分級屬性

將 Rating 屬性添加到 Models/Movie.cs:

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

生成應(yīng)用 (Ctrl+Shift+B)。

因?yàn)橐呀?jīng)添加新字段到 Movie 類,所以需要更新綁定允許名單,將此新屬性納入其中。 在 MoviesController.cs 中,更新 Create 和 Edit 操作方法的 [Bind] 屬性,以包括 Rating 屬性:

C#

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

更新視圖模板以在瀏覽器視圖中顯示、創(chuàng)建和編輯新的 Rating 屬性。

編輯 /Views/Movies/Index.cshtml 文件并添加 Rating 字段:

HTML

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

使用 Rating 字段更新 /Views/Movies/Create.cshtml。

可以復(fù)制/粘貼之前的“窗體組”,并讓 intelliSense 幫助更新字段。 IntelliSense 適用于標(biāo)記幫助程序。

開發(fā)人員已在視圖的第二個標(biāo)簽元素中鍵入字母 R 用作 asp-for 的特性值。

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

C#

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

在 DB 更新為包括新字段之前,應(yīng)用將不會正常工作。 如果它現(xiàn)在運(yùn)行,將引發(fā)以下 SqlException:

SqlException: Invalid column name 'Rating'.

發(fā)生此錯誤是因?yàn)楦碌?Movie 模型類與現(xiàn)有數(shù)據(jù)庫的 Movie 表架構(gòu)不同。 (數(shù)據(jù)庫表中沒有 Rating 列。)

可通過幾種方法解決此錯誤:

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

對于本教程,請使用 Code First 遷移。

從“工具”菜單中,選擇“NuGet 包管理器”>“包管理器控制臺”。

PMC 菜單

在 PMC 中,輸入以下命令:

PowerShell
Add-Migration Rating
Update-Database

Add-Migration 命令會通知遷移框架使用當(dāng)前 Movie DB 架構(gòu)檢查當(dāng)前 Movie 模型,并創(chuàng)建必要的代碼,將 DB 遷移到新模型。

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

如果刪除 DB 中的所有記錄,初始化方法會設(shè)定 DB 種子,并將包括 Rating 字段。

運(yùn)行應(yīng)用,并驗(yàn)證是否可以創(chuàng)建/編輯/顯示具有 Rating 字段的電影。 應(yīng)向 Edit、Details 和 Delete 視圖模板添加 Rating 字段。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號