次の方法で共有


チュートリアル: .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を使用するには、次のものがローカルにインストールされている必要があります。

詳細については、 セットアップとツールの、および SDK を参照してください。

サンプル ソリューションを作成する

  1. Visual Studioの上部にある [ファイル]>[新しい>プロジェクト] に移動します。
  2. ダイアログ ウィンドウで、 を検索し、Web アプリ 選択します。 次にを選択します。
  3. [新しいプロジェクトの構成] 画面で、次の手順を実行します。
    • AspireSQLEFCoreプロジェクト名 を入力します。
    • 値の は既定値のままにし、[次へ]選択します。
  4. 追加情報 画面で、次の手順を実行します。
    • .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 クラスは、データベースの移行と接続時にこの接続を自動的に使用します。

アプリをローカルで実行してテストする

これで、サンプル アプリをテストする準備ができました。 次の手順を実行して、送信されたフォーム データがデータベースに保持されていることを確認します。

  1. の上部にある実行ボタン (または F5) を選択して、ブラウザーで プロジェクト ダッシュボードを起動します。

  2. [プロジェクト] ページの [AspireSQLEFCore 行] で、[エンドポイント] 列にあるリンクをクリックして、あなたのアプリのUIを開きます。

    .NET.NET Aspire サポート アプリケーションのホーム ページを示すスクリーンショット。

  3. Title フィールドと Description フォーム フィールドにサンプル データを入力します。

  4. [送信] ボタンを選択すると、サポートチケットが処理のために送信されます。その後、[クリア] を選択してフォームをクリアします。

  5. 送信したデータは、ページの再読み込み時にページの下部にあるテーブルに表示されます。

関連項目