第 2 部分:在 ASP.NET Core 中將模型新增至 Razor Pages 應用程式

Note

這不是這篇文章的最新版本。 關於目前版本,請參閱 本文的 .NET 10 版本

Warning

不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 關於目前版本,請參閱 本文的 .NET 10 版本

在此教程中,您將新增用於管理資料庫中電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

新增資料模型

  1. 解決方案總管中,右鍵點擊 RazorPagesMovie 專案。 選擇 新增>新資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType] 屬性,指定 ReleaseDate 屬性中的資料型別。 透過使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 僅顯示日期,沒有時間資訊。
  • 之後 string 加問號表示該性質可為零。 如需詳細資料,請參閱 可為 Null 的參考型別

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

為影片模型建立樣板

在這個章節中,你架起了電影模型。 鷹架工具為電影模型產生建立、讀取、更新與刪除(CRUD)操作的頁面。

  1. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  2. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

新的範本項目。

  1. 新增 Scaffold 對話方塊中,選取 使用 Entity Framework 的 RazorPages (CRUD)>新增

加裝鷹架。

  1. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
      2. 在 [資料庫提供者] 下拉式清單中,選取 [SQL Server]
    3. 選取 ,然後新增

    新增 Razor 頁面。

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

下一個教學會解釋所建立的檔案。

Scaffold 程序會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages()
   .WithStaticAssets();

app.Run();

在這個教學的後半段,你會了解這些 Program.cs 變更。

利用 EF 的遷移功能建立初始資料庫架構

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 此方法保留資料庫中的現有資料。

在此區段中,請使用 套件管理員主控台 (PMC)視窗來:

  • 新增初始移轉。

  • 使用初始移轉來更新資料庫。

  • 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC選單。

  • 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    
  • Add-Migration 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 這個 InitialCreate 參數命名了遷移。 你可以用任何名字,但依慣例選擇一個能描述遷移過程的名字。

會顯示以下警告,請稍後處理:

實體類型「Movie」的「Price」小數欄未指定商店類型。 此條件會導致若值不符合預設精度與縮放範圍,則會被靜默截斷。 可明確指定可容納 'OnModelCreating' 中所有值的 SQL 伺服器欄位類型(使用 'HasColumnType'),或用「HasPrecision' 指定精確度與縮放,或使用 'HasConversion' 配置值轉換器。

  • 在 PMC 中,輸入下列命令:

    Update-Database
    

    指令 Update-Database 會在未套用的遷移中執行該 Up 方法。 在此情況下,命令會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

資料內容 RazorPagesMovieContext

產生檔案的 RazorPagesMovieContext 類別 Data/RazorPagesMovieContext.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱是透過呼叫 DbContextOptions 物件上的方法傳入上下文。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試新建連結。

建立頁面。

Note

你可能無法在欄位輸入小數逗號 Price 。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  1. 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 在應用程式啟動時,請以相依注入方式登錄服務,例如資料庫上下文 EF Core 。 透過建構參數提供需要這些服務的元件(例如 Razor 頁面)。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

支架工具會自動建立資料庫上下文,並將其註冊到相依注入容器中。 Scaffolder 會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages()
   .WithStaticAssets();

app.Run();

使用已完成的範例進行疑難排解

若您遇到無法解決的問題,請將您的程式碼與已完成的專案進行比較。 檢視或下載已完成的專案 (如何下載)。

後續步驟

在本教學中,將新增用於管理資料庫中電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

新增資料模型

  1. 方案總管中,以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType] 屬性,指定 ReleaseDate 屬性中的資料型別。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。
  • string 後面的問號表示該屬性可為 null。 如需更多資訊,請參閱可為 Null 的參考類型

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

  1. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  2. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

    新增鷹架式題目

  3. 新增 Scaffold 對話方塊中,選取 使用 Entity Framework 的 RazorPages (CRUD)>新增

    新增鷹架

  4. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
      2. 在 [資料庫提供者] 下拉式清單中,選取 [SQL Server]
    3. 選取 ,然後新增

    新增 Razor Pages

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

下一個教學課程將說明建立的檔案。

Scaffold 程序會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

這些 Program.cs 變更將於本教學稍後說明。

使用 EF 的移轉功能建立初始資料庫結構描述

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 保留資料庫中的現有資料。

在本節中,您可以使用套件管理員主控台 (PMC) 視窗進行下列作業:

  • 新增初始移轉。

  • 使用初始移轉來更新資料庫。

  • 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC 菜單

  • 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    
  • Add-Migration 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數可用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

畫面上顯示下列警告,在稍後的步驟中會解決此問題:

沒有為實體型別 'Movie' 上的十進位資料行 'Price' 指定型別。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL 伺服器資料行型別。

  • 在 PMC 中,輸入下列命令:

    Update-Database
    

    Update-Database 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,命令會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

資料內容 RazorPagesMovieContext

產生檔案的 RazorPagesMovieContext 類別 Data/RazorPagesMovieContext.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試新建連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  3. 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。 Scaffolder 會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

使用已完成的範例進行疑難排解

若您遇到無法解決的問題,請將您的程式碼與已完成的專案進行比較。 檢視或下載已完成的專案 (如何下載)。

後續步驟

在本教學中,將新增用於管理資料庫中電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

新增資料模型

  1. 方案總管中,以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType] 屬性,指定 ReleaseDate 屬性中的資料型別。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。
  • string 後面的問號表示該屬性可為 null。 如需更多資訊,請參閱可為 Null 的參考類型

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

  1. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  2. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

    新增鷹架式題目

  3. 新增 Scaffold 對話方塊中,選取 使用 Entity Framework 的 RazorPages (CRUD)>新增

    新增鷹架

  4. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
      2. 在 [資料庫提供者] 下拉式清單中,選取 [SQL Server]
    3. 選取 ,然後新增

    新增 Razor Pages

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

下一個教學課程將說明建立的檔案。

Scaffold 程序會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

這些 Program.cs 變更將於本教學稍後說明。

使用 EF 的移轉功能建立初始資料庫結構描述

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 保留資料庫中的現有資料。

在本節中,您可以使用套件管理員主控台 (PMC) 視窗進行下列作業:

  • 新增初始移轉。

  • 使用初始移轉來更新資料庫。

  • 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC 菜單

  • 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    
  • Add-Migration 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數可用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

畫面上顯示下列警告,在稍後的步驟中會解決此問題:

沒有為實體型別 'Movie' 上的十進位資料行 'Price' 指定型別。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL 伺服器資料行型別。

  • 在 PMC 中,輸入下列命令:

    Update-Database
    

    Update-Database 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,命令會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

資料內容 RazorPagesMovieContext

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試新建連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  3. 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。 Scaffolder 會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

使用已完成的範例進行疑難排解

若您遇到無法解決的問題,請將您的程式碼與已完成的專案進行比較。 檢視或下載已完成的專案 (如何下載)。

後續步驟

在本教學中,將新增用於管理資料庫中電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

新增資料模型

  1. 方案總管中,以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType] 屬性,指定 ReleaseDate 屬性中的資料型別。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。
  • string 後面的問號表示該屬性可為 null。 如需更多資訊,請參閱可為 Null 的參考類型

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

  1. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  2. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

    新增鷹架式題目

  3. 新增 Scaffold 對話方塊中,選取 使用 Entity Framework 的 RazorPages (CRUD)>新增

    新增鷹架

  4. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
      2. 在 [資料庫提供者] 下拉式清單中,選取 [SQL Server]
    3. 選取 ,然後新增

    新增 Razor Pages

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

下一個教學課程將說明建立的檔案。

Scaffold 程序會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

這些 Program.cs 變更將於本教學稍後說明。

使用 EF 的移轉功能建立初始資料庫結構描述

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 保留資料庫中的現有資料。

在本節中,您可以使用套件管理員主控台 (PMC) 視窗進行下列作業:

  • 新增初始移轉。
  • 使用初始移轉來更新資料庫。
  1. 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC 菜單

  2. 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    Update-Database
    
  • Add-Migration 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數可用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

  • Update-Database 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,命令會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

畫面上顯示下列警告,在稍後的步驟中會解決此問題:

沒有為實體型別 'Movie' 上的十進位資料行 'Price' 指定型別。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL 伺服器資料行型別。

資料內容 RazorPagesMovieContext

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試新建連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  3. 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。 Scaffolder 會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

使用已完成的範例進行疑難排解

若您遇到無法解決的問題,請將您的程式碼與已完成的專案進行比較。 檢視或下載已完成的專案 (如何下載)。

後續步驟

在本教學中,將新增用於管理資料庫中電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

新增資料模型

  1. 方案總管中,以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Movie 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType] 屬性,指定 ReleaseDate 屬性中的資料型別。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

  1. 新增 NuGet 套件 Microsoft.EntityFrameworkCore.Design,這是 Scaffolding 工具的必要套件。

    1. 在 [工具] 功能表中,選取 [NuGet 套件管理員]>[管理解決方案的 NuGet 套件]NuGet 套件管理員 - 管理
    2. 選取 瀏覽 索引標籤。
    3. 輸入 Microsoft.EntityFrameworkCore.Design,然後從清單中選取它。
    4. 核取 [專案],然後選取 [安裝]
    5. 授權接受 對話方塊中,選取 我接受NuGet 套件管理員 - 新增套件
  2. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  3. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

    新增鷹架式題目

  4. 新增 Scaffold 對話方塊中,選取 使用 Entity Framework 的 RazorPages (CRUD)>新增

    新增鷹架

  5. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
    3. 選取 ,然後新增

    新增 Razor Pages

    如果您收到錯誤訊息,指出您必須安裝 Microsoft.EntityFrameworkCore.SqlServer 套件,請從 [新增]>[新增 Scaffolded 項目] 開始重複執行步驟。

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

下一個教學課程將說明建立的檔案。

Scaffold 程序會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

這些 Program.cs 變更將於本教學稍後說明。

使用 EF 的移轉功能建立初始資料庫結構描述

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 保留資料庫中的現有資料。

在本節中,您可以使用套件管理員主控台 (PMC) 視窗進行下列作業:

  • 新增初始移轉。
  • 使用初始移轉來更新資料庫。
  1. 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC 菜單

  2. 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    Update-Database
    
    

上述命令會安裝 Entity Framework Core 工具,並執行 migrations 命令來產生建立初始資料庫結構描述的程式碼。

畫面上顯示下列警告,在稍後的步驟中會解決此問題:

沒有為實體型別 'Movie' 上的十進位資料行 'Price' 指定型別。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL 伺服器資料行型別。

migrations 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

update 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,update 會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。 Scaffolder 會將下列醒目提示的程式碼新增至 Program.cs 檔案:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

資料內容 RazorPagesMovieContext

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試新建連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  3. 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

使用已完成的範例進行疑難排解

若您遇到無法解決的問題,請將您的程式碼與已完成的專案進行比較。 檢視或下載已完成的專案 (如何下載)。

後續步驟

在本節中,您可以新增類別來管理資料庫中的電影。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。 您可先撰寫模型類別,然後 EF Core 會建立資料庫。

模型類別稱為 POCO 類別(源自「Plain-Old CLR Objects」),因為它們不相依於 EF Core。 它們會定義資料儲存在資料庫中的屬性。

檢視或下載範例程式碼 (如何下載)。

新增資料模型

  1. 方案總管中,以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

  2. 以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

  3. 將下列屬性新增至 Movie 類別:

    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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType(DataType.Date)][DataType] 屬性會指定資料型別 (Date)。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

  1. 建立 Pages/Movies 資料夾:

    1. 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
    2. 將資料夾命名為 Movies
  2. 以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

    新增鷹架式題目

  3. 新增 Scaffold 對話方塊中,選取 Razor使用 Entity Framework 的頁面 (CRUD)>新增

    新增鷹架

  4. 完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

    1. Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
    2. 資料內容類別 列中,選取 +(加號)。
      1. 在 [新增資料內容] 對話方塊中,即會產生類別名稱 RazorPagesMovie.Data.RazorPagesMovieContext
    3. 選取 ,然後新增

    新增 Razor Pages

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

建立和更新的檔案

樣板流程會建立下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

更新的檔案

  • Startup.cs

下一節將說明所建立和更新的檔案。

使用 EF 的移轉功能建立初始資料庫結構描述

Entity Framework Core 中的移轉功能讓您可以:

  • 建立初始資料庫結構描述。
  • 以累加方式更新資料庫結構描述,以便與應用程式的資料模型保持同步。 保留資料庫中的現有資料。

在本節中,您可以使用套件管理員主控台 (PMC) 視窗進行下列作業:

  • 新增初始移轉。
  • 使用初始移轉來更新資料庫。
  1. 從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

    PMC 菜單

  2. 在 PMC 中,輸入下列命令:

    Add-Migration InitialCreate
    Update-Database
    

針對 SQL Server,上述命令會產生下列警告:「沒有為實體類型 'Movie' 上的十進位資料行 'Price' 指定型別」。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL Server 資料行類型。」

請忽略此警告,因為會在稍後的步驟中解決此問題。

migrations 命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

update 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,update 會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。

檢查 Startup.ConfigureServices 方法。 反白顯示的那一行是由 Scaffolder 新增的:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext 會協調 EF Core 模型的 Movie 功能,例如建立、讀取、更新和刪除。 資料內容 (RazorPagesMovieContext) 衍生自 Microsoft.EntityFrameworkCore.DbContext。 資料內容會指定資料模型包含哪些實體。

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  1. 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

    如果您收到下列錯誤:

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

    您漏掉了遷移步驟

  2. 測試 Create 連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  3. 測試 EditDetailsDelete 連結。

Entity Framework Core 的 SQL 記錄功能

記錄組態通常是由 Logging 檔案的 appsettings.{Environment}.json 區段所提供。 若要記錄 SQL 陳述式,請將 "Microsoft.EntityFrameworkCore.Database.Command": "Information" 新增至 appsettings.Development.json 檔案:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

使用上述 JSON 時,SQL 陳述式會顯示在命令列和 Visual Studio 輸出視窗中。

如需詳細資訊,請參閱下列資源:

下一個教學課程說明 Scaffolding 所建立的檔案。

後續步驟

在本節中,會新增用於管理電影的類別。 應用程式的模型類別會使用 Entity Framework Core (EF Core) 來處理資料庫。 EF Core 是可簡化資料存取的物件關聯對應程式 (O/RM)。

模型類別稱為 POCO 類別 (來自「純舊 CLR 物件」),因為它們對 EF Core 沒有任何相依性。 它們會定義資料儲存在資料庫中的屬性。

檢視或下載範例程式碼 (如何下載)。

Warning

本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程

新增資料模型

以滑鼠右鍵按一下 RazorPagesMovie 專案 >新增>新增資料夾。 將資料夾命名為 Models

以滑鼠右鍵按一下 Models 資料夾。 選取 新增>類別。 將類別命名為 Movie

將下列屬性新增至 Movie 類別:

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 類別包含:

  • ID 欄位是資料庫對於主索引鍵的必要欄位。

  • [DataType(DataType.Date)]DataType 屬性會指定資料型別 (Date)。 使用此屬性:

    • 使用者不需要在日期欄位中輸入時間資訊。
    • 只會顯示日期,不會顯示時間資訊。

稍後的教學課程會涵蓋 DataAnnotations

稍後的教學課程會涵蓋 DataAnnotations

建置專案,以確認沒有任何編譯錯誤。

建立影片模型骨架

在本節中,將建立影片模型。 也就是說,Scaffolding 工具會為電影模型產生建立、讀取、更新和刪除 (CRUD) 的頁面。

建立 Pages/Movies 資料夾:

  • 以滑鼠右鍵按一下 Pages 資料夾 >[新增]>[新增資料夾]
  • 將資料夾命名為 Movies

以滑鼠右鍵按一下 Pages/Movies 資料夾 >[新增]>[新增 Scaffolded 項目]

VS Code 上的新樣板化項目

新增 Scaffold 對話方塊中,選取 Razor使用 Entity Framework 的頁面 (CRUD)>新增

在 VScode 上新增 Scaffold

完成 使用 Entity Framework (CRUD) 新增Razor頁面 對話方塊:

  • Model class 下拉式清單中,選取 Movie (RazorPagesMovie.Models)
  • 資料內容類別 資料列中,選取 + (加號),然後將產生的名稱從 RazorPagesMovie.Models.RazorPagesMovieContext 變更為 RazorPagesMovie.Data.RazorPagesMovieContext。 這不是必要的變更。 它會使用正確的命名空間來建立資料庫內容類別。
  • 選取 ,然後新增

在 VS Code 上新增 Razor 頁面

appsettings.json 檔案會更新為包含用於連線至本機資料庫的連接字串。

建立的檔案

Scaffold 程序會建立並更新下列檔案:

  • Pages/Movies:建立、刪除、詳細資料、編輯和索引。
  • Data/RazorPagesMovieContext.cs

Updated

  • Startup.cs

下一節將說明所建立和更新的檔案。

初始移轉

在本節中,您可以使用套件管理員主控台 (PMC) 進行下列作業:

  • 新增初始移轉。
  • 以初始移轉更新資料庫。

從 [工具] 功能表中,選取 [NuGet 套件管理員]> [套件管理員主控台]

PMC 菜單

在 PMC 中,輸入下列命令:

Add-Migration InitialCreate
Update-Database

上述命令會產生下列警告:「沒有為實體類型 'Movie' 上的十進位資料行 'Price' 指定型別」。 如果這些值不符合預設的精度和小數位數,便會在未發出任何提示的情況下遭到截斷。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL Server 資料行類型。」

請忽略此警告,因為會在稍後的步驟中解決此問題。

移轉命令會產生程式碼來建立初始資料庫結構描述。 結構描述是以 DbContext 中指定的模型為基礎。 InitialCreate 引數用來命名移轉。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。

update 命令會在尚未套用的移轉中執行 Up 方法。 在此情況下,update 會在 Up 檔案中執行 Migrations/<time-stamp>_InitialCreate.cs 方法,以建立資料庫。

檢查透過相依性插入註冊的內容脈絡

ASP.NET Core 內建相依性插入。 服務 (例如 EF Core 資料庫內容) 是在應用程式啟動期間使用相依性插入來註冊。 需要這些服務的元件 (例如 Razor Pages) 會透過建構函式參數提供。 取得資料庫內容執行個體的建構函式程式碼將在本教學課程後面說明。

Scaffolding 工具會自動建立資料庫內容物件,並將其註冊到相依性注入容器中。

檢查 Startup.ConfigureServices 方法。 反白顯示的那一行是由 Scaffolder 新增的:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext 會協調 EF Core 模型的 Movie 功能,例如建立、讀取、更新和刪除。 資料內容 (RazorPagesMovieContext) 衍生自 Microsoft.EntityFrameworkCore.DbContext。 資料內容會指定資料模型包含哪些實體。

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

上述程式碼會建立實體集的 DbSet<Movie> 屬性。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體對應到資料表中的資料列。

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,設定系統會從 appsettings.json 檔案讀取連接字串。

測試應用程式

  • 執行應用程式,並將 /Movies 附加至瀏覽器中的 URL (http://localhost:port/movies)。

如果您收到以下錯誤訊息:

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

您漏掉了遷移步驟

  • 測試 Create 連結。

    建立頁面

    Note

    您可能無法在 Price 欄位中輸入小數逗號。 若要讓 jQuery 驗證支援使用逗號(",")作為小數點的非英語地區設定,以及非美式英語的日期格式,則必須將應用程式全球化。 如需全球化指示,請參閱此 GitHub 問題 \(英文\)。

  • 測試 EditDetailsDelete 連結。

下一個教學課程說明 Scaffolding 所建立的檔案。

後續步驟