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

注意

這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本

重要

這些發行前產品的相關資訊在產品正式發行前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

如需目前版本,請參閱本文的 .NET 8 版本

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

模型類別稱為 POCO 類別 (來自「純舊 CLR 物件」),因為它們對 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

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

Scaffold 影片模型

在本節中會 scaffold 影片模型。 亦即 Scaffolding 工具會產生影片模型的建立、讀取、更新和刪除 (CRUD) 作業頁面。

  1. 建立 Pages/Movies 資料夾:

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

    新增 Scaffold 項目

  3. 在 [新增 Scaffold] 對話方塊中,選取 [使用 Entity Framework (CRUD) 的 Razor Pages]>[新增]

    新增 Scaffold

  4. 完成 [使用 Entity Framework (CRUD) 新增 Razor Pages] 對話方塊:

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

    新增 Razor Pages

appsettings.json 檔案會隨即更新用來連線到本機資料庫的連接字串。

建立和更新的檔案

Scaffold 處理序會建立下列檔案:

  • 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 方法。 在此情況下,命令會在 Migrations/<time-stamp>_InitialCreate.cs 檔案中執行 Up 方法,以建立資料庫。

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

沒有為實體型別 '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. 測試新建連結。

    建立頁面

    注意

    您可能無法在 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 類別 (來自「純舊 CLR 物件」),因為它們對 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

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

Scaffold 影片模型

在本節中會 scaffold 影片模型。 亦即 Scaffolding 工具會產生影片模型的建立、讀取、更新和刪除 (CRUD) 作業頁面。

  1. 建立 Pages/Movies 資料夾:

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

    新增 Scaffold 項目

  3. 在 [新增 Scaffold] 對話方塊中,選取 [使用 Entity Framework (CRUD) 的 Razor Pages]>[新增]

    新增 Scaffold

  4. 完成 [使用 Entity Framework (CRUD) 新增 Razor Pages] 對話方塊:

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

    新增 Razor Pages

appsettings.json 檔案會隨即更新用來連線到本機資料庫的連接字串。

建立和更新的檔案

Scaffold 處理序會建立下列檔案:

  • 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 方法。 在此情況下,命令會在 Migrations/<time-stamp>_InitialCreate.cs 檔案中執行 Up 方法,以建立資料庫。

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

沒有為實體型別 '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. 測試新建連結。

    建立頁面

    注意

    您可能無法在 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 類別 (來自「純舊 CLR 物件」),因為它們對 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

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

Scaffold 影片模型

在本節中會 scaffold 影片模型。 亦即 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 項目]

    新增 Scaffold 項目

  4. 在 [新增 Scaffold] 對話方塊中,選取 [使用 Entity Framework (CRUD) 的 Razor Pages]>[新增]

    新增 Scaffold

  5. 完成 [使用 Entity Framework (CRUD) 新增 Razor Pages] 對話方塊:

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

    新增 Razor Pages

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

appsettings.json 檔案會隨即更新用來連線到本機資料庫的連接字串。

建立和更新的檔案

Scaffold 處理序會建立下列檔案:

  • 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 會在 Migrations/<time-stamp>_InitialCreate.cs 檔案中執行 Up 方法,以建立資料庫。

檢查使用相依性插入所註冊的內容

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. 測試新建連結。

    建立頁面

    注意

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

  3. 測試 EditDetailsDelete 連結。

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

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

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

下一步

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

模型類別稱為 POCO 類別 (來自「純舊 CLR 物件」),因為它們對 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

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

Scaffold 影片模型

在本節中會 scaffold 影片模型。 亦即 Scaffolding 工具會產生影片模型的建立、讀取、更新和刪除 (CRUD) 作業頁面。

  1. 建立 Pages/Movies 資料夾:

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

    新增 Scaffold 項目

  3. 在 [新增 Scaffold] 對話方塊中,選取 [使用 Entity Framework (CRUD) 的 Razor Pages]>[新增]

    新增 Scaffold

  4. 完成 [使用 Entity Framework (CRUD) 新增 Razor Pages] 對話方塊:

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

    新增 Razor Pages

appsettings.json 檔案會隨即更新用來連線到本機資料庫的連接字串。

建立和更新的檔案

Scaffold 處理序會建立下列檔案:

  • 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 會在 Migrations/<time-stamp>_InitialCreate.cs 檔案中執行 Up 方法,以建立資料庫。

檢查使用相依性插入所註冊的內容

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 會協調 Movie 模型的 EF Core 功能,例如建立、讀取、更新和刪除。 資料內容 (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 連結。

    建立頁面

    注意

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

  3. 測試 EditDetailsDelete 連結。

Entity Framework Core 的 SQL 記錄

記錄組態通常是由 appsettings.{Environment}.json 檔案的 Logging 區段所提供。 若要記錄 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 輸出視窗中。

如需詳細資訊,請參閱在 .NET Core 和 ASP.NET Core 中記錄和此 GitHub 問題

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

下一步

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

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

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

新增資料模型

以滑鼠右鍵按一下 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

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

Scaffold 影片模型

在本節中會 scaffold 影片模型。 亦即 Scaffolding 工具會產生影片模型的建立、讀取、更新和刪除 (CRUD) 作業頁面。

建立 Pages/Movies 資料夾:

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

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

VScode 上的新 Scaffolded 項目

在 [新增 Scaffold] 對話方塊中,選取 [使用 Entity Framework (CRUD) 的 Razor Pages]>[新增]

在 VScode 上新增 Scaffold

完成 [使用 Entity Framework (CRUD) 新增 Razor Pages] 對話方塊:

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

在 VScode 上新增 Razor Pages

appsettings.json 檔案會隨即更新用來連線到本機資料庫的連接字串。

建立的檔案

隨即建立 Scaffold 處理序並更新下列檔案:

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

已更新

  • Startup.cs

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

初始移轉

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

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

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

PMC 功能表

在 PMC 中,輸入下列命令:

Add-Migration InitialCreate
Update-Database

上述命令會產生下列警告:「沒有為實體類型 'Movie' 上的十進位資料行 'Price' 指定型別」。 如果它們不符合預設的有效位數和小數位數,會導致以無訊息模式截斷這些值。 使用 'HasColumnType()' 明確指定可容納所有值的 SQL Server 資料行類型。」

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

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

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

檢查使用相依性插入所註冊的內容

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 會協調 Movie 模型的 EF Core 功能,例如建立、讀取、更新和刪除。 資料內容 (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 連結。

    建立頁面

    注意

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

  • 測試 EditDetailsDelete 連結。

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

下一步