チュートリアル: .NET Aspire と Entity Framework Core を使用して ASP.NET Core アプリを SQL Server に接続する
このチュートリアルでは、.NET AspireEntity Framework CoreSQL Server 統合を使用して SQL Server に接続してサポート チケット データの読み取りと書き込みを行う ASP.NET Core アプリを作成します。 Entity Framework Core は、.NET 開発者が .NET オブジェクトを使用してデータベースを操作できるようにする、軽量で拡張可能なオープン ソース のオブジェクト リレーショナル マッパーです。 次の方法について学習します。
- .NET Aspire 統合を使用するように設定された基本的な .NET アプリを作成する
- SQL Server に接続するための .NET Aspire 統合を追加する
- .NET .NET Aspire コンポーネント機能を構成して使用して、データベースの読み取りと書き込みを行う
前提 条件
.NET .NET Aspireを使用するには、次のものがローカルにインストールされている必要があります。
- .NET 8.0 または .NET 9.0
- OCI 準拠のコンテナー ランタイム。次に例を示します。
- デスクトップ または
、 。 詳細については、「コンテナーランタイム」を参照してください。
- デスクトップ または
- 次のような統合開発者環境 (IDE) またはコード エディター。
- Visual Studio 2022 バージョン 17.9 以降 (オプション)
-
Visual Studio Code (省略可能)
- C# Dev Kit: 拡張 (省略可能)
- JetBrains Rider と .NET.NET Aspire プラグイン (オプション)
詳細については、
サンプル ソリューションを作成する
- Visual Studioの上部にある [ファイル]>[新しい>プロジェクト] に移動します。
- ダイアログ ウィンドウで、
を検索し、Web アプリ 選択します。 次にを選択します。 - [新しいプロジェクトの構成] 画面で、次の手順を実行します。
- AspireSQLEFCoreの プロジェクト名 を入力します。
- 値の
は既定値のままにし、[次へ] 選択します。
-
追加情報 画面で、次の手順を実行します。
- .NET 9.0 が選択されていることを確認します。
インタラクティブレンダリングモード が[なし]設定されていることを確認します。 - オーケストレーション オプションで
参加 チェック ボックスをオンにし、[の作成] 選択します。
Visual Studio は、.NET Aspireを使用するように構成された新しい ASP.NET Core ソリューションを作成します。 このソリューションは、次のプロジェクトで構成されます。
- AspireSQLEFCore: サービスの既定値に依存する Blazor プロジェクト。
- AspireSQLEFCore.AppHost: アプリのさまざまなプロジェクトとサービスを接続して構成するように設計されたオーケストレーター プロジェクト。 オーケストレーターはスタートアップ プロジェクトとして設定する必要があります。
- AspireSQLEFCore.ServiceDefaults: ソリューション内のプロジェクト間で再利用できる構成を保持するための共有クラス ライブラリです。
データベース モデルとコンテキスト クラスを作成する
ユーザーが送信したサポート要求を表すには、次の SupportTicket
モデル クラスを AspireSQLEFCore プロジェクトのルートに追加します。
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;
}
次の TicketDbContext
データ コンテキスト クラスを、の AspireSQLEFCore プロジェクトのルートに追加します。 このクラスは、Entity Framework を操作する System.Data.Entity.DbContext を継承し、データベースを表します。
using Microsoft.EntityFrameworkCore;
using System.Reflection.Metadata;
namespace AspireSQLEFCore;
public class TicketContext(DbContextOptions options) : DbContext(options)
{
public DbSet<SupportTicket> Tickets => Set<SupportTicket>();
}
Blazor アプリに .NET Aspire 統合を追加する
.NET Aspire Entity 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();
このメソッドは、次のタスクを実行します。
- コンテナー化された Azure SQL Database に接続するための
TicketContext
を DI コンテナーに登録します。 - 対応する正常性チェック、ログ記録、テレメトリを自動的に有効にします。
データベースを作成する
ローカルで開発するときは、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()
は運用環境には適していないため、コンテキストで定義されているデータベースのみが作成されることに注意してください。 移行は適用されません。
フォームを作成する
アプリでは、ユーザーがサポート チケット情報を送信し、データベースにエントリを保存できるようにするためのフォームが必要です。
次の 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();
}
}
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 Container リソースをアプリに追加し、sqldata
という名前のデータベースへの接続を構成します。 先ほど構成した Entity Framework クラスは、データベースの移行と接続時にこの接続を自動的に使用します。
アプリをローカルで実行してテストする
これで、サンプル アプリをテストする準備ができました。 次の手順を実行して、送信されたフォーム データがデータベースに保持されていることを確認します。
の上部にある実行ボタン (または F5 ) を選択して、ブラウザーで プロジェクト ダッシュボードを起動します。 [プロジェクト] ページの [AspireSQLEFCore 行] で、[エンドポイント] 列にあるリンクをクリックして、あなたのアプリのUIを開きます。
Title
フィールドとDescription
フォーム フィールドにサンプル データを入力します。[送信] ボタンを選択すると、サポートチケットが処理のために送信されます。その後、[クリア] を選択してフォームをクリアします。
送信したデータは、ページの再読み込み時にページの下部にあるテーブルに表示されます。
関連項目
- SQL Database デプロイ を使用した
- .NET Aspire デプロイを Azure Container Apps 経由で行う
Actions を使用して プロジェクトを配置する
.NET Aspire