在此部分中,Entity Framework Code First 遷移用于:
使用 EF Code First 自動(dòng)創(chuàng)建數(shù)據(jù)庫時(shí),Code First 將:
通過自動(dòng)驗(yàn)證同步的架構(gòu)/模型可以更容易地發(fā)現(xiàn)不一致的數(shù)據(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>
更新以下頁面:
在 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ò)誤:
對(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 文件。
生成解決方案。
從“工具”菜單中,選擇“NuGet 包管理器”>“包管理器控制臺(tái)”。 在 PMC 中,輸入以下命令:
Add-Migration Rating
Update-Database
Add-Migration
命令會(huì)通知框架執(zhí)行以下操作:
Movie
模型與 Movie
DB 架構(gòu)進(jìn)行比較。名稱“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ù)庫:
Update-Database
運(yùn)行應(yīng)用,并驗(yàn)證是否可以創(chuàng)建/編輯/顯示具有 Rating 字段的電影。 如果數(shù)據(jù)庫未設(shè)定種子,則在 SeedData.Initialize 方法中設(shè)置斷點(diǎn)。
更多建議: