在 ASP.NET Core 中向 Razor Pages 應(yīng)用添加模型

2021-12-13 15:50 更新

在本節(jié)中,添加了用于管理數(shù)據(jù)庫中的電影的類。 這些類與 Entity Framework Core(EF Core)一起使用來處理數(shù)據(jù)庫。 EF Core 是一種對(duì)象關(guān)系映射 (ORM) 框架,可以簡(jiǎn)化數(shù)據(jù)訪問代碼。

模型類稱為 POCO 類(源自“簡(jiǎn)單傳統(tǒng) CLR 對(duì)象”),因?yàn)樗鼈兣c EF Core 沒有任何依賴關(guān)系。 它們定義數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)屬性。

查看或下載示例。

添加數(shù)據(jù)模型

右鍵單擊“RazorPagesMovie”項(xiàng)目 >“添加” > “新建文件夾”。 將文件夾命名為“Models”。

右鍵單擊“Models”文件夾。 選擇“添加” > “類”。 將類命名“Movie”。

向 Movie 類添加以下屬性:

C#
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ò)誤。

搭建“電影”模型的基架

在此部分,將搭建“電影”模型的基架。 確切地說,基架工具將生成頁面,用于對(duì)“電影”模型執(zhí)行創(chuàng)建、讀取、更新和刪除 (CRUD) 操作。

創(chuàng)建“Pages/Movies”文件夾:

  • 右鍵單擊 Pages 文件夾 >“添加” > “新建文件夾”。
  • 將文件夾命名為“Movies”

右鍵單擊 Pages/Movies 文件夾 >“添加” > “新搭建基架的項(xiàng)目”。

上述說明的圖像。

在“添加基架”對(duì)話框中,選擇“使用實(shí)體框架生成 Razor Pages (CRUD)” > “添加”。

上述說明的圖像。

完成“使用實(shí)體框架(CRUD)添加 Razor Pages”對(duì)話框:

  • 在“模型類”下拉列表中,選擇“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 中,輸入以下命令:

PMC
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)系注入注冊(cè)的上下文

ASP.NET Core 通過依賴關(guān)系注入進(jìn)行生成。 服務(wù)(例如 EF Core 數(shù)據(jù)庫上下文)在應(yīng)用程序啟動(dòng)期間通過依賴關(guān)系注入進(jìn)行注冊(cè)。 需要這些服務(wù)(如 Razor 頁面)的組件通過構(gòu)造函數(shù)提供相應(yīng)服務(wù)。 本教程的后續(xù)部分介紹了用于獲取 DB 上下文實(shí)例的構(gòu)造函數(shù)代碼。

基架工具自動(dòng)創(chuàng)建 DB 上下文并將其注冊(cè)到依賴關(guān)系注入容器。

檢查 Startup.ConfigureServices 方法。 基架添加了突出顯示的行:

C#
// 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#
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ù)表相對(duì)應(yīng)。 實(shí)體對(duì)應(yīng)表中的行。

通過調(diào)用 DbContextOptions 對(duì)象中的一個(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)更多信息,請(qǐng)參見教程:使用遷移功能 - ASP.NET MVC 和 EF Core。

Update-Database 命令在用于創(chuàng)建數(shù)據(jù)庫的 Migrations/{time-stamp}_InitialCreate.cs 文件中運(yùn)行 Up方法。

測(cè)試應(yīng)用

  • 運(yùn)行應(yīng)用并將 /Movies 追加到瀏覽器中的 URL (http://localhost:port/movies)。

如果收到錯(cuò)誤:

console

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

缺少遷移步驟。

  • 測(cè)試“創(chuàng)建”鏈接。

創(chuàng)建頁面

 

備注可能無法在 Price 字段中輸入十進(jìn)制逗號(hào)。 若要使 jQuery 驗(yàn)證支持使用逗號(hào)(“,”)表示小數(shù)點(diǎn)的非英語區(qū)域設(shè)置,以及支持非美國英語日期格式,應(yīng)用必須進(jìn)行全球化。 有關(guān)全球化的說明,請(qǐng)參閱

此 GitHub 問題。

  • 測(cè)試“編輯”、“詳細(xì)信息”和“刪除”鏈接。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)