共用方式為


教學課程:使用 .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.NET Aspire 設定和工具.NET.NET Aspire SDK

建立範例解決方案

  1. 在 Visual Studio頂端,流覽至 [檔案]>[新增>專案]。
  2. 在對話框視窗中,搜尋 Blazor,然後選取 Blazor Web 應用程式。 選擇 下一步
  3. 在 [設定您的新專案 的畫面上:
    • 輸入 項目名稱AspireSQLEFCore
    • 將數值的 rest 保留為預設值,然後選取 [下一步]
  4. 在 [其他資訊 畫面:
    • 確定已選取 .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 類別會在移轉並連線到資料庫時,自動使用此連線。

在本機執行及測試應用程式

範例應用程式現在已準備好進行測試。 完成下列步驟,確認提交的表單資料會保存至資料庫:

  1. 選取 Visual Studio 頂端的 [執行] 按鈕(或 F5),以在瀏覽器中啟動您的 .NET.NET Aspire 項目儀錶板。

  2. 在 [專案] 頁面上,在 [AspireSQLEFCore] 數據列中,按兩下 [端點] 資料行中的連結,以開啟應用程式的 UI。

    顯示 .NET.NET Aspire 支援應用程式的首頁螢幕快照。

  3. TitleDescription 表單域輸入範例數據。

  4. 選取 [送出] 按鈕,窗體會提交支援票證進行處理 — (然後點擊 [清除] 清除窗體)。

  5. 您送出的數據會在頁面重載時顯示在頁面底部的數據表中。

另請參閱