使用資料
提示
本內容節錄自《Blazor for ASP NET Web Forms Developers for Azure》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。
資料存取是 ASP.NET Web Forms 應用程式的骨幹。 如果您要為 Web 建置表單,該資料會發生什麼情況? 透過 Web Form,您可以使用多種資料存取技術來與資料庫互動:
- 資料來源
- ADO.NET
- Entity Framework
資料來源是您可以放置在 Web Form 頁面上的控制項,並可與其他控制項一樣進行設定。 Visual Studio 提供了一組易記的對話,可設定控制項並將其繫結至 Web Form 頁面。 首次發行 Web Form 時,喜愛「低程式碼」或「無程式碼」方法的開發人員會偏好使用這項技術。
ADO.NET 是與資料庫互動的低階方法。 您的應用程式可以使用命令、Datatable 和資料集來建立與資料庫的連線,以進行互動。 結果接著可以繫結至螢幕上的欄位,而不需要太多程式碼。 此方法的缺點是每個 ADO.NET 物件 (Connection
、Command
和 DataTable
) 已繫結至資料庫廠商所提供的程式庫。 使用這些元件可讓程式碼變得固定,且難以移轉至不同的資料庫。
Entity Framework
Entity Framework (EF) 是 .NET Foundation 所維護的開放原始碼物件關聯式對應架構。 自 .NET Framework 發行起,EF 便允許使用產生資料庫連線、儲存體結構描述和互動的程式碼。 在去掉這項作業後,您可以專注於應用程式的商務規則,並允許受信任的資料庫管理員管理資料庫。 在 .NET 中,您可以使用名為 EF Core 的 EF 更新版本。 EF Core 可協助您產生和維護程式碼與資料庫之間的互動,以及一系列可使用 dotnet ef
命令列工具的命令。 讓我們來看看部分範例,以讓您能夠使用資料庫。
EF Code First
開始建置資料庫互動的其中一項快速方法,是從您想要處理的類別物件著手。 EF 會提供工具來協助為類別產生適當的資料庫程式碼。 這種方法稱為 "Code First" 開發。 針對我們想要儲存在 Microsoft SQL Server 等關聯式資料庫中的範例店面應用程式,請考慮下列 Product
類別。
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
會儲存在針對文字儲存設定的資料行中,且最大長度設定為 4000 個字元,如[MaxLength]
屬性所指定。 資料庫結構描述會透過資料類型varchar(4000)
,使用名為MaxLength
的資料行來設定。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 的類別。 若要建構類別,請使用下列命令的變化形:
dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer
上述命令會使用指定的連接字串和 Microsoft.EntityFrameworkCore.SqlServer
提供者連線至資料庫。 連線之後,就會建立名為 MyDbContext
的資料庫內容類別。 此外,還會針對使用 -t
選項指定的 Product
和 Customer
資料表建立支援類別。 此命令有許多組態選項,可產生適合您資料庫的類別階層。 如需完整參考,請參閱命令的文件。
如需 EF Core 的詳細資訊,請參閱 Microsoft Docs 網站。
與 Web 服務進行互動
初次發行 ASP.NET 時,SOAP 服務是網頁伺服器和用戶端交換資料的慣用方式。 但自那以後發生了許多變化,且與服務的慣用互動也已轉為直接 HTTP 用戶端互動。 透過 ASP.NET Core 和 Blazor,您可以在 Program.cs 或 Startup
類別的 ConfigureServices
方法中註冊 HttpClient
的組態。 當您需要與 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
的用戶端。 用戶端會設有基底位址,並會適當地設定要求標頭。 請使用屬性上的 @inject
指示詞或 [Inject]
屬性,將 IHttpClientFactory
插入 Blazor 元件中。 同時使用下列語法建立具名用戶端,並與服務互動:
@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 要求。