다음을 통해 공유


자습서: ASP.NET Core 및 SQL Server을 사용하여 .NET Aspire 앱을 Entity Framework Core에 연결하기

이 자습서에서는 ASP.NET Core 앱을 만들어 .NET AspireEntity Framework CoreSQL Server 통합을 사용하여 SQL Server에 연결한 후, 지원 티켓 데이터를 읽고 쓰기 위한 것입니다. Entity Framework Core .NET 개발자가 .NET 개체를 사용하여 데이터베이스를 사용할 수 있도록 하는 가볍고 확장 가능한 오픈 소스 개체 관계형 매퍼입니다. 다음 방법을 배우게 됩니다.

  • .NET 통합을 사용하도록 설정된 기본 .NET Aspire 앱 만들기
  • .NET Aspire와 SQL Server을 연결하기 위해 통합을 추가하세요.
  • 데이터베이스에서 읽고 쓰기 위해 .NET.NET Aspire 구성 요소 기능 구성 및 사용

필수 구성 요소

.NET .NET Aspire작업하려면 다음을 로컬에 설치해야 합니다.

자세한 내용은 .NET.NET Aspire 설정 및 도구.NET.NET Aspire SDK참조하세요.

샘플 솔루션 만들기

  1. Visual Studio상단에서 파일>>프로젝트으로 이동하세요.
  2. 대화 상자 창에서 Blazor 검색하고 Blazor Web App선택합니다. 다음선택합니다.
  3. 새 프로젝트 구성 화면에서 다음을 수행합니다.
    • 프로젝트 이름 입력: AspireSQLEFCore.
    • 나머지 값을 기본값으로 두고 다음선택합니다.
  4. 추가 정보 화면에서 다음을 수행합니다.
    • .NET 9.0 선택되어 있는지 확인합니다.
    • 대화형 렌더 모드없음으로 설정되어 있는지 확인하십시오.
    • 오케스트레이션에 등록 옵션을 선택하고 만들기를 선택합니다.

Visual Studio은 ASP.NET Core를 사용하도록 구조화된 새 .NET Aspire 솔루션을 만듭니다. 솔루션은 다음 프로젝트로 구성됩니다.

  • AspireSQLEFCore: 서비스 기본값에 따라 달라지는 Blazor 프로젝트입니다.
  • AspireSQLEFCore.AppHost: 앱의 다양한 프로젝트와 서비스를 연결하고 구성하도록 설계된 오케스트레이터 프로젝트입니다. 오케스트레이터는 시작 프로젝트로 설정해야 합니다.
  • AspireSQLEFCore.ServiceDefaults: 솔루션의 프로젝트에서 다시 사용할 수 있는 구성을 보유하는 공유 클래스 라이브러리입니다.

데이터베이스 모델 및 컨텍스트 클래스 만들기

사용자가 제출한 지원 요청을 나타내려면 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;
}

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 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.1.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\AspireSQLEFCore.ServiceDefaults\AspireSQLEFCore.ServiceDefaults.csproj" />
  </ItemGroup>

</Project>

.NET .NET Aspire 통합 구성

Program.cs 프로젝트의 파일에서, AddSqlServerDbContext을 만든 후 builder를 호출하기 전에 AddServiceDefaults 확장 메서드에 대한 호출을 추가합니다. 자세한 내용은 .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();

이 메서드는 다음 작업을 수행합니다.

  • 컨테이너화된 TicketContext SQL Database에 연결하기 위해 DI 컨테이너에 Azure 등록합니다.
  • 해당 상태 검사, 로깅 및 원격 분석을 자동으로 사용하도록 설정합니다.

데이터베이스 만들기

로컬로 개발하는 동안 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
@using Microsoft.EntityFrameworkCore

<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

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. 맨 위에 있는 실행 단추(또는 F5)를 선택하여 브라우저에서 프로젝트 대시보드를 시작합니다.

  2. 프로젝트 페이지의 AspireSQLEFCore 행에서 엔드포인트 열의 링크를 클릭하여 앱의 UI를 엽니다.

    .NET.NET Aspire 지원 애플리케이션의 홈페이지를 보여 주는 스크린샷

  3. TitleDescription 양식 필드에 샘플 데이터를 입력하십시오.

  4. 제출하기 버튼을 선택하면 양식이 처리를 위해 지원 티켓을 제출합니다. 그런 다음 지우기 버튼을 선택하여 양식을 지웁니다.

  5. 제출한 데이터는 페이지가 다시 로드될 때 페이지 아래쪽의 테이블에 표시됩니다.

  6. AspireSQL 웹앱과 .NET.NET Aspire 대시보드를 표시하는 웹 브라우저 탭을 닫습니다.

  7. Visual Studio 전환하고 디버깅을 중지하려면 중지 단추를 선택하거나 Shift + F5누릅니다.

  8. 두 번째 디버깅을 시작하려면 Visual Studio 맨 위에 있는 실행 단추를 선택합니다(또는 F5 ).

  9. .NET .NET Aspire 대시보드의 프로젝트 페이지의 AspireSQLEFCore 행에서 엔드포인트 열의 링크를 클릭하여 앱의 UI를 엽니다.

  10. 페이지에는 이전 실행에서 만든 티켓이 표시되지 않습니다.

  11. AspireSQL 웹앱과 .NET.NET Aspire 대시보드를 표시하는 웹 브라우저 탭을 닫습니다.

  12. Visual Studio 전환하고 디버깅을 중지하려면 중지 단추를 선택하거나 Shift + F5누릅니다.

재시작 후에도 데이터 유지

개발자는 개발 환경에서 다시 시작할 때도 데이터가 유지되어 더 현실적인 데이터베이스를 통해 코드를 실행할 수 있기를 선호합니다. .NET .NET Aspire지속성을 구현하려면 WithDataVolume 메서드를 사용합니다. 이 메서드는 데이터베이스 컨테이너에 Docker 볼륨을 추가하며 디버깅을 다시 시작할 때마다 제거되지 않습니다.

  1. Visual Studio AspireSQLEFCore.AppHost 프로젝트에서 Program.cs 코드 파일을 두 번 클릭하세요.

  2. 다음 코드를 찾습니다.

    var sql = builder.AddSqlServer("sql")
                     .AddDatabase("sqldata");
    
  3. 다음과 일치하도록 코드를 수정합니다.

    var sql = builder.AddSqlServer("sql")
                     .WithDataVolume()
                     .AddDatabase("sqldata");
    

데이터 지속성 실행 및 테스트

데이터 볼륨이 솔루션의 동작을 변경하는 방법을 살펴보겠습니다.

  1. 맨 위에 있는 실행 단추(또는 F5)를 선택하여 브라우저에서 프로젝트 대시보드를 시작합니다.
  2. 프로젝트 페이지의 AspireSQLEFCore 행에서 엔드포인트 열의 링크를 클릭하여 앱의 UI를 엽니다.
  3. TitleDescription 양식 필드에 샘플 데이터를 입력하십시오.
  4. 제출하기 버튼을 선택하면 양식이 처리를 위해 지원 티켓을 제출합니다. 그런 다음 지우기 버튼을 선택하여 양식을 지웁니다.
  5. 제출한 데이터는 페이지가 다시 로드될 때 페이지 아래쪽의 테이블에 표시됩니다.
  6. AspireSQL 웹앱과 .NET.NET Aspire 대시보드를 표시하는 웹 브라우저 탭을 닫습니다.
  7. Visual Studio 전환하고 디버깅을 중지하려면 중지 단추를 선택하거나 Shift + F5누릅니다.
  8. 두 번째 디버깅을 시작하려면 Visual Studio 맨 위에 있는 실행 단추를 선택합니다(또는 F5 ).
  9. .NET .NET Aspire 대시보드의 프로젝트 페이지의 AspireSQLEFCore 행에서 엔드포인트 열의 링크를 클릭하여 앱의 UI를 엽니다.
  10. 이제 페이지에 이전 실행에서 만든 티켓이 표시됩니다.

참조하세요