教學課程:使用 .NET Aspire 和 Entity Framework Core 將 ASP.NET Core 應用程式連線到 SQL Server
在本教學課程中,您會建立 ASP.NET Core 應用程式,該應用程式會使用 .NET AspireEntity Framework CoreSQL Server 整合來連線到 SQL Server,以讀取和寫入支援票證數據。 Entity Framework Core 是輕量型、可延伸的開放原始碼對象關係型對應程式,可讓 .NET 開發人員使用 .NET 對象來處理資料庫。 您將瞭解如何:
- 建立已設定為使用 .NET Aspire 整合的基本 .NET 應用程式
- 新增 .NET Aspire 整合功能以連線至 SQL Server
- 設定及使用 .NET.NET Aspire 元件功能以讀取和寫入資料庫
先決條件
若要使用 .NET.NET Aspire,您需要在本地安裝下列軟體:
- .NET 8.0 或 .NET 9.0
- 符合 OCI 規範的容器運行時間,例如:
- Docker Desktop 或 Podman。 如需詳細資訊,請參閱 容器運行時間。
- 整合式開發人員環境 (IDE) 或程式碼編輯器,例如:
- Visual Studio 2022 17.9 版或更高版本 (選用)
-
Visual Studio Code (選擇性)
- C# Dev Kit:擴充功能(選擇性)
- JetBrains Rider 搭配 .NET.NET Aspire 外掛程式 (選用)
如需詳細資訊,請參閱 .NET.NET Aspire 設定和工具和 .NET.NET Aspire SDK。
建立範例解決方案
- 在 Visual Studio頂端,流覽至 [檔案]>[新增>專案]。
- 在對話框視窗中,搜尋 Blazor,然後選取 Blazor Web 應用程式。 選擇 下一步。
- 在 [設定您的新專案 的畫面上:
- 輸入 項目名稱 的 AspireSQLEFCore。
- 將數值的 rest 保留為預設值,然後選取 [下一步]。
- 在 [其他資訊 畫面:
- 確定已選取 .NET 9.0。
- 確定 互動式渲染模式 設定為 無。
- 勾選 [登記] 在 [.NET.NET Aspire 協調流程] 選項中,然後選取 [建立]。
Visual Studio 建立了一個新的 ASP.NET Core 解決方案,這個解決方案的結構是使用 .NET Aspire。 解決方案包含以下專案:
- AspireSQLEFCore:相依於服務預設值的 Blazor 專案。
- AspireSQLEFCore.AppHost:協調器專案,其設計目的是連線及設定應用程式的不同項目和服務。 協調器應該設定為啟始專案。
- AspireSQLEFCore.ServiceDefaults:共用類別庫,用來保存可在解決方案中跨專案重複使用的組態。
建立資料庫模型和內容類別
若要代表使用者提交的支援要求,請在 AspireSQLEFCore 專案的根目錄中新增下列 SupportTicket
模型類別。
using System.ComponentModel.DataAnnotations;
namespace AspireSQLEFCore;
public sealed class SupportTicket
{
public int Id { get; set; }
[Required]
public string Title { get; set; } = string.Empty;
[Required]
public string Description { get; set; } = string.Empty;
}
在 AspireSQLEFCore 專案的根目錄中新增下列 TicketDbContext
數據內容類別。 類別會繼承 System.Data.Entity.DbContext,以使用 Entity Framework 並代表您的資料庫。
using Microsoft.EntityFrameworkCore;
using System.Reflection.Metadata;
namespace AspireSQLEFCore;
public class TicketContext(DbContextOptions options) : DbContext(options)
{
public DbSet<SupportTicket> Tickets => Set<SupportTicket>();
}
將 .NET Aspire 整合新增至 Blazor 應用程式
將 .NET AspireEntity Framework Core Sql Server 連結庫套件 新增至 AspireSQLEFCore 專案:
dotnet add package Aspire.Microsoft.EntityFrameworkCore.SqlServer
您的 AspireSQLEFCore 項目現在已設定為使用 .NET.NET Aspire 整合。 這是更新的 AspireSQLEFCore.csproj 檔案:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AspireSQLEFCore.ServiceDefaults\AspireSQLEFCore.ServiceDefaults.csproj" />
</ItemGroup>
</Project>
設定 .NET.NET Aspire 整合
在 AspireSQLEFCore 項目的 Program.cs 檔案中,於建立 builder
之後,但在呼叫 AddServiceDefaults
之前,新增 AddSqlServerDbContext 擴充方法的呼叫。 如需詳細資訊,請參閱 .NET.NET Aspire 服務預設值。 提供連接字串的名稱做為參數。
using AspireSQLEFCore;
using AspireSQLEFCore.Components;
var builder = WebApplication.CreateBuilder(args);
builder.AddSqlServerDbContext<TicketContext>("sqldata");
builder.AddServiceDefaults();
// Add services to the container.
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
var app = builder.Build();
app.MapDefaultEndpoints();
此方法會完成下列工作:
- 向 DI 容器註冊
TicketContext
,以連線到容器化 Azure SQL Database。 - 自動啟用對應的健康情況檢查、記錄和遙測。
建立資料庫
在本機開發時,您必須在 SQL Server 容器內建立資料庫。 使用下列程式代碼更新 Program.cs 檔案:
using AspireSQLEFCore;
using AspireSQLEFCore.Components;
var builder = WebApplication.CreateBuilder(args);
builder.AddSqlServerDbContext<TicketContext>("sqldata");
builder.AddServiceDefaults();
// Add services to the container.
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
var app = builder.Build();
app.MapDefaultEndpoints();
if (app.Environment.IsDevelopment())
{
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<TicketContext>();
context.Database.EnsureCreated();
}
}
else
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days.
// You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
上述程式代碼:
- 檢查應用程式是否在開發環境中執行。
- 如果是,它會從 DI 容器擷取
TicketContext
服務,並在資料庫不存在時呼叫Database.EnsureCreated()
來建立資料庫。
注意
請注意,EnsureCreated()
不適用於生產環境,而且只會建立內容中所定義的資料庫。 它不會套用任何遷移。 如需 Entity Framework Core 在 .NET Aspire中移轉的詳細資訊,請參閱 在 .NET Aspire中套用 Entity Framework Core 移轉。
建立表單
應用程式需要一個表單,使用者才能提交技術支持票資訊,並將條目儲存至資料庫。
使用下列 Razor 標記來建立基本表單,取代位於 AspireSQLEFCore/Components/Pages 目錄中的 Home.razor 檔案內容:
@page "/"
@inject TicketContext context
<div class="row">
<div class="col-md-6">
<div>
<h1 class="display-4">Request Support</h1>
</div>
<EditForm Model="@Ticket" FormName="Tickets" method="post"
OnValidSubmit="@HandleValidSubmit" class="mb-4">
<DataAnnotationsValidator />
<div class="mb-4">
<label>Issue Title</label>
<InputText class="form-control" @bind-Value="@Ticket.Title" />
<ValidationMessage For="() => Ticket.Title" />
</div>
<div class="mb-4">
<label>Issue Description</label>
<InputText class="form-control" @bind-Value="@Ticket.Description" />
<ValidationMessage For="() => Ticket.Description" />
</div>
<button class="btn btn-primary" type="submit">Submit</button>
<button class="btn btn-danger mx-2" type="reset" @onclick=@ClearForm>Clear</button>
</EditForm>
<table class="table table-striped">
@foreach (var ticket in Tickets)
{
<tr>
<td>@ticket.Id</td>
<td>@ticket.Title</td>
<td>@ticket.Description</td>
</tr>
}
</table>
</div>
</div>
@code {
[SupplyParameterFromForm(FormName = "Tickets")]
private SupportTicket Ticket { get; set; } = new();
private List<SupportTicket> Tickets = [];
private void ClearForm() => Ticket = new();
protected override async Task OnInitializedAsync()
{
Tickets = await context.Tickets.ToListAsync();
}
private async Task HandleValidSubmit()
{
context.Tickets.Add(Ticket);
await context.SaveChangesAsync();
Tickets = await context.Tickets.ToListAsync();
ClearForm();
}
}
如需在 Blazor中建立表單的詳細資訊,請參閱 ASP.NET CoreBlazor 表單概觀。
設定 AppHost
AspireSQLEFCore.AppHost 項目是應用程式的協調器。 它負責連線和設定應用程式的不同項目和服務。 協調器應該設定為啟始專案。
將 .NET Aspire Hosting Sql Server NuGet 套件新增至 AspireStorage.AppHost 專案:
dotnet add package Aspire.Hosting.SqlServer
使用下列程式代碼取代 AspireSQLEFCore.AppHost 專案中 Program.cs 檔案的內容:
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddSqlServer("sql")
.AddDatabase("sqldata");
builder.AddProject<Projects.AspireSQLEFCore>("aspiresql")
.WithReference(sql)
.WaitFor(sql);
builder.Build().Run();
上述程式代碼會將 SQL Server 容器資源新增至您的應用程式,並設定與名為 sqldata
的資料庫連線。 您稍早設定的 Entity Framework 類別會在移轉並連線到資料庫時,自動使用此連線。
在本機執行及測試應用程式
範例應用程式現在已準備好進行測試。 完成下列步驟,確認提交的表單資料會保存至資料庫:
選取 Visual Studio 頂端的 [執行] 按鈕(或 F5),以在瀏覽器中啟動您的 .NET.NET Aspire 項目儀錶板。
在 [專案] 頁面上,在 [AspireSQLEFCore] 數據列中,按兩下 [端點] 資料行中的連結,以開啟應用程式的 UI。
在
Title
和Description
表單域輸入範例數據。選取 [送出] 按鈕,窗體會提交支援票證進行處理 — (然後點擊 [清除] 清除窗體)。
您送出的數據會在頁面重載時顯示在頁面底部的數據表中。
另請參閱
- 使用 SQL Database 部署 .NET.NET Aspire
- 透過
部署 - 使用 GitHub Actions 部署 .NET Aspire 專案