共用方式為


處理數據

小提示

本內容節錄自《Blazor for ASP NET Web Forms Developers for Azure》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。

Blazor-for-ASP-NET-Web-Forms-Developers 電子書封面縮圖。

數據存取是 ASP.NET Web Forms 應用程式的骨幹。 如果您要為 Web 建置表單,該數據會發生什麼事? 使用 Web Forms 時,您可以使用多個資料存取技術來與資料庫互動:

  • 數據源
  • ADO.NET
  • 實體框架 (Entity Framework)

數據源是您可以在 Web Forms 頁面上放置的控件,並像其他控件一樣進行設定。 Visual Studio 提供了一組易記的對話,可設定控件並將其系結至您的 Web Forms 頁面。 第一次發行 Web Forms 時,享有「低程式代碼」或「無程式代碼」方法的開發人員偏好使用這項技術。

數據源

ADO.NET 是與資料庫互動的低階方法。 您的應用程式可以使用命令、數據數據表和數據集來建立資料庫的連線,以進行互動。 然後,結果可以系結至螢幕上的字段,而不需要太多程序代碼。 此方法的缺點是,每個 ADO.NET 物件集 (ConnectionCommandDataTable) 都系結至資料庫廠商所提供的連結庫。 使用這些元件可讓程式代碼殭化且難以移轉至不同的資料庫。

實體框架 (Entity Framework)

Entity Framework (EF) 是 .NET Foundation 所維護的開放原始碼對象關係型對應架構。 EF 最初是使用 .NET Framework 發行,可讓您產生資料庫連線、記憶體架構和互動的程序代碼。 透過這個抽象概念,您可以專注於應用程式的商務規則,並允許由受信任的資料庫管理員管理資料庫。 在 .NET 中,您可以使用名為 EF Core 的 EF 更新版本。 EF Core 可協助您透過 dotnet ef 指令工具,產生並管理程式碼與資料庫之間的互動,以及一系列可供使用的指令。 讓我們看看一些範例,讓您能夠使用資料庫。

EF Code First

開始建置資料庫互動的快速方法,就是從您想要處理之類別對象開始。 EF 提供工具來協助為您的類別產生適當的資料庫程序代碼。 這種方法稱為「程式代碼優先」開發。 請考慮以下 Product 類別,用於要儲存在像 Microsoft SQL Server 這樣的關係資料庫中的範例店面應用程式。

public class Product
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [MaxLength(4000)]
    public string Description { get; set; }

    [Range(0, 99999,99)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
}

產品有主鍵和三個將在資料庫中建立的額外欄位:

  • EF 會依照慣例將 Id 屬性識別為主鍵。
  • Name 將會儲存在針對文字儲存設定的數據行中。 [Required]屬性將會裝飾該屬性,並新增not null限制,以協助確保遵循該屬性的宣告行為。
  • Description 將會儲存在針對文字儲存區設定的數據行中,而且屬性所 [MaxLength] 指定的長度上限為 4000 個字元。 資料庫架構將會使用數據類型 MaxLength來設定名為 varchar(4000) 的數據行。
  • 屬性 Price 會儲存為貨幣。 屬性 [Range] 會產生適當的條件約束,以防止在宣告的最小值和最大值之外儲存數據。

我們需要將此 Product 類別新增至資料庫內容類別,以定義資料庫的連接和轉譯作業。

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

類別 MyDbContext 提供一個屬性,定義 類別的 Product 存取和轉譯。 您的應用程式會使用 Startup 類別中的 ConfigureServices 方法來設定此類別,使其與資料庫互動(或在 Program.cs 的適當位置使用 builder.Services 屬性,而非 services

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer("MY DATABASE CONNECTION STRING"));

上述程式代碼會使用指定的連接字串連接到 SQL Server 資料庫。 您可以將連接字串放在 appsettings.json 檔案、環境變數或其他組態儲存位置,並適當地取代此內嵌字串。

然後,您可以使用下列命令來產生適合此類別的資料庫資料表:

dotnet ef migrations add 'Create Product table'
dotnet ef database update

第一個命令會將您對資料庫架構所做的變更定義為名為 Create Product table的新EF移轉。 移轉會定義如何套用和移除新的資料庫變更。

套用之後,您的資料庫中會有簡單的 Product 數據表,以及一些新增至專案的新類別,以協助管理資料庫架構。 根據預設,您可以在名為 Migrations 的新資料夾中找到這些產生的類別。 當您變更 Product 類別或新增想要與資料庫互動的更多相關類別時,您必須使用新的移轉名稱再次執行命令列命令。 此命令會產生另一組移轉類別,以更新您的資料庫架構。

EF Database First

針對現有的資料庫,您可以使用 .NET 命令行工具來產生 EF Core 的類別。 若要為類別搭建 Scaffold,請使用下列各種命令:

dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer

上述命令會使用指定的連接字串和 Microsoft.EntityFrameworkCore.SqlServer 提供者連接到資料庫。 聯機之後,就會建立名為 MyDbContext 的資料庫內容類別。 此外,會針對Product使用 選項指定的 Customer-t 數據表建立支持類別。 此命令有許多組態選項,可產生適合您資料庫的類別階層。 如需完整的參考,請參閱 命令的文件

如需 EF Core 的詳細資訊,請參閱 Microsoft Docs 網站。

與 Web 服務進行互動

第一次發行 ASP.NET 時,SOAP 服務是網頁伺服器和用戶端交換數據的慣用方式。 自那以後發生了許多變化,與服務的慣用互動已轉向直接 HTTP 用戶端互動。 使用 ASP.NET Core 和 Blazor,您可以在 HttpClient 類別的 Startup 方法中註冊ConfigureServices的組態。 當您需要與 HTTP 端點互動時,請使用該組態。 請考慮下列設定程式碼:

// in Program.cs
builder.Services.AddHttpClient("github", client =>
{
    client.BaseAddress = new Uri("http://api.github.com/");
    // GitHub API versioning
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    // GitHub requires a user-agent
    client.DefaultRequestHeaders.Add("User-Agent", "BlazorWebForms-Sample");
});

每當您需要從 GitHub 存取數據時,請建立名稱為的 github用戶端。 用戶端會設定基位址,並適當地設定要求標頭。 將IHttpClientFactory注入到您的Blazor元件中,使用@inject指示詞或在屬性上的[Inject]屬性。 使用下列語法建立具名用戶端並與服務互動:

@inject IHttpClientFactory factory

...

@code {
    protected override async Task OnInitializedAsync()
    {
        var client = factory.CreateClient("github");
        var response = await client.GetAsync("repos/dotnet/docs/issues");
        response.EnsureStatusCode();
        var content = await response.Content.ReadAsStringAsync();
    }
}

這個方法會傳回字串,描述 dotnet/docs GitHub 存放庫中的問題集合。 它會以 JSON 格式傳回內容,並還原串行化為適當的 GitHub 問題物件。 有許多方式可讓您設定 HttpClientFactory 來傳遞預先設定 HttpClient 的物件。 請嘗試針對您使用的各種 Web 服務,使用不同的名稱和端點來設定多個 HttpClient 實例。 此方法可使您在每個頁面上與這些服務的互動變得更加方便。 如需詳細資訊,請參閱 使用 IHttpClientFactory 提出 HTTP 要求