在 ASP.NET Core 中向 Razor Pages 應(yīng)用添加模型
添加數(shù)據(jù)模型
右鍵單擊“RazorPagesMovie” 項(xiàng)目 >“添加” > “新建文件夾” 峭跳。 將文件夾命名為“Models” 堡妒。
右鍵單擊“Models”文件夾 。 選擇“添加” > “類” 。 將類命名“Movie” 。
向 Movie
類添加以下屬性:
C#復(fù)制
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
Movie
類包含:
數(shù)據(jù)庫需要
ID
字段以獲取主鍵。-
[DataType(DataType.Date)]
:DataType 屬性指定數(shù)據(jù)的類型(日期)。 通過此特性:- 用戶無需在數(shù)據(jù)字段中輸入時(shí)間信息明也。
- 僅顯示日期,而非時(shí)間信息惯裕。
DataAnnotations 會(huì)在后續(xù)教程中介紹温数。
生成項(xiàng)目以驗(yàn)證沒有任何編譯錯(cuò)誤。
搭建“電影”模型的基架
在此部分蜻势,將搭建“電影”模型的基架撑刺。 確切地說,基架工具將生成頁面握玛,用于對“電影”模型執(zhí)行創(chuàng)建猜煮、讀取次员、更新和刪除 (CRUD) 操作。
創(chuàng)建“Pages/Movies”文件夾 :
- 右鍵單擊“Pages” 文件夾 >“添加” >“新建文件夾” 王带。
- 將文件夾命名為“Movies”
右鍵單擊“Pages/Movies” 文件夾 >“添加” >“新搭建基架的項(xiàng)目” 。
在“添加基架”對話框中愕撰,選擇“使用實(shí)體框架生成 Razor Pages (CRUD)”>“添加” 。
完成“使用實(shí)體框架(CRUD)添加 Razor Pages”對話框 :
- 在“模型類”下拉列表中搞挣,選擇“Movie (RazorPagesMovie.Models) 。
- 在“數(shù)據(jù)上下文類”行中音羞,選擇 +(加號(hào))并接受生成的名稱“RazorPagesMovie.Models.RazorPagesMovieContext” 囱桨。
- 選擇“添加” 。
appsettings.json 文件通過用于連接到本地?cái)?shù)據(jù)的連接字符串進(jìn)行更新舍肠。
在搭建基架時(shí),會(huì)創(chuàng)建并更新以下文件:
創(chuàng)建的文件
- Pages/Movies:“創(chuàng)建”窘面、“刪除”翠语、“詳細(xì)信息”、“編輯”和“索引”财边。
- Data/RazorPagesMovieContext.cs
文件已更新
- Startup.cs
創(chuàng)建和更新的文件將在下一節(jié)中說明肌括。
初始遷移
在此部分中,程序包管理器控制臺(tái) (PMC) 用于:
- 添加初始遷移酣难。
- 使用初始遷移來更新數(shù)據(jù)庫谍夭。
從“工具”菜單中,選擇“NuGet 程序包管理器”>“包管理器控制臺(tái)” 憨募。
在 PMC 中紧索,輸入以下命令:
PMC復(fù)制
Add-Migration Initial
Update-Database
前面的命令生成以下警告:“No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'.”
你可以忽略該警告,它將后面的教程中得到修復(fù)馋嗜。
ef migrations add InitialCreate
命令生成用于創(chuàng)建初始數(shù)據(jù)庫架構(gòu)的代碼齐板。 此架構(gòu)的依據(jù)為 DbContext
中指定的模型(在 RazorPagesMovieContext.cs 文件中) 。 InitialCreate
參數(shù)用于為遷移命名葛菇。 可以使用任何名稱甘磨,但是按照慣例,會(huì)選擇可說明遷移的名稱眯停。
ef database update
命令在 Migrations/<time-stamp>_InitialCreate.cs 文件中運(yùn)行 Up
方法 济舆。Up
方法會(huì)創(chuàng)建數(shù)據(jù)庫。
檢查通過依賴關(guān)系注入注冊的上下文
ASP.NET Core 通過依賴關(guān)系注入進(jìn)行生成莺债。 服務(wù)(例如 EF Core 數(shù)據(jù)庫上下文)在應(yīng)用程序啟動(dòng)期間通過依賴關(guān)系注入進(jìn)行注冊滋觉。 需要這些服務(wù)(如 Razor 頁面)的組件通過構(gòu)造函數(shù)提供相應(yīng)服務(wù)签夭。 本教程的后續(xù)部分介紹了用于獲取 DB 上下文實(shí)例的構(gòu)造函數(shù)代碼。
基架工具自動(dòng)創(chuàng)建 DB 上下文并將其注冊到依賴關(guān)系注入容器椎侠。
檢查 Startup.ConfigureServices
方法第租。 基架添加了突出顯示的行:
C#復(fù)制
// This method gets called by the runtime.
// Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is
// needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
RazorPagesMovieContext
為 Movie
模型協(xié)調(diào) EF Core 功能(創(chuàng)建、讀取我纪、更新慎宾、刪除等)。 數(shù)據(jù)上下文 (RazorPagesMovieContext
) 派生自 Microsoft.EntityFrameworkCore.DbContext浅悉。 數(shù)據(jù)上下文指定數(shù)據(jù)模型中包含哪些實(shí)體趟据。
C#復(fù)制
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Models
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
前面的代碼為實(shí)體集創(chuàng)建 DbSet<Movie>
屬性。 在實(shí)體框架術(shù)語中术健,實(shí)體集通常與數(shù)據(jù)表相對應(yīng)汹碱。 實(shí)體對應(yīng)表中的行。
通過調(diào)用 DbContextOptions 對象中的一個(gè)方法將連接字符串名稱傳遞到上下文荞估。 進(jìn)行本地開發(fā)時(shí)咳促, ASP.NET Core 配置系統(tǒng) 在 appsettings.json 文件中讀取數(shù)據(jù)庫連接字符串。
Add-Migration
命令生成用于創(chuàng)建初始數(shù)據(jù)庫架構(gòu)的代碼泼舱。 此架構(gòu)的依據(jù)為 RazorPagesMovieContext
中指定的模型(在 Data/RazorPagesMovieContext.cs 文件中)等缀。Initial
參數(shù)用于為遷移命名。 可以使用任何名稱娇昙,但是按照慣例尺迂,會(huì)使用可說明遷移的名稱。 有關(guān)詳細(xì)信息冒掌,請參閱 教程:使用遷移功能 - ASP.NET MVC 和 EF Core噪裕。
Update-Database
命令在用于創(chuàng)建數(shù)據(jù)庫的 Migrations/{time-stamp}_InitialCreate.cs 文件中運(yùn)行 Up
方法 。
測試應(yīng)用
- 運(yùn)行應(yīng)用并將
/Movies
追加到瀏覽器中的 URL (http://localhost:port/movies
)股毫。
如果收到錯(cuò)誤:
console復(fù)制
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
缺少遷移步驟膳音。
-
測試“創(chuàng)建” 鏈接。
備注
可能無法在
Price
字段中輸入十進(jìn)制逗號(hào)铃诬。 若要使 jQuery 驗(yàn)證支持使用逗號(hào)(“,”)表示小數(shù)點(diǎn)的非英語區(qū)域設(shè)置祭陷,以及支持非美國英語日期格式,應(yīng)用必須進(jìn)行全球化趣席。 有關(guān)全球化的說明兵志,請參閱此 GitHub 問題。 測試“編輯” 宣肚、“詳細(xì)信息” 和“刪除” 鏈接想罕。