Tutorial: Conectar um aplicativo ASP.NET Core a SQL Server usando .NET Aspire e Entity Framework Core
Neste tutorial, você criará um app ASP.NET Core que usa uma integração .NET AspireEntity Framework CoreSQL Server para se conectar a SQL Server para ler e gravar dados de ticket de suporte. Entity Framework Core é um mapeador relacional de objeto leve, extensível e de software livre que permite que .NET desenvolvedores trabalhem com bancos de dados usando objetos .NET. Você aprenderá a:
- Criar um aplicativo básico de .NET configurado para usar as integrações de .NET Aspire
- Adicionar uma integração .NET Aspire para conectar ao SQL Server
- Configurar e usar recursos do componente .NET.NET Aspire para ler e gravar no banco de dados
Pré-requisitos
Para trabalhar com .NET.NET Aspire, você precisa do seguinte instalado localmente:
- .NET 8.0 ou .NET 9.0
- Um runtime de contêiner compatível com OCI, como:
- Docker Desktop ou Podman. Para obter mais informações, consulte Tempo de execução do contêiner.
- Um IDE (Ambiente de Desenvolvedor Integrado) ou um editor de código, como:
- Visual Studio 2022 versão 17.9 ou superior (opcional)
-
Visual Studio Code (opcional)
- C# Dev Kit: Extensão (opcional)
- JetBrains Rider com .NET.NET Aspire plug-in (opcional)
Para obter mais informações, consulte .NET.NET Aspirede instalação e ferramentas e .NET.NET Aspiredo SDK.
Criar a solução de exemplo
- Na parte superior do Visual Studio, navegue até >Novo>Projeto.
- Na janela de diálogo, pesquise Blazor e selecione Blazor Web App. Escolha Próximo.
- Na tela Configurar seu novo projeto:
- Insira um de Nome do Projeto de AspireSQLEFCore.
- Deixe o rest nos valores padrão e selecione Próximo.
- Na tela Informações adicionais:
- Verifique se .NET 9.0 está selecionado.
- Verifique se o modo de renderização interativo está definido como None.
- Verifique a opção Enlistar em .NETorquestração.NET Aspire e selecione Criar.
Visual Studio cria uma nova solução ASP.NET Core estruturada para usar .NET Aspire. A solução consiste nos seguintes projetos:
- AspireSQLEFCore: um projeto de Blazor que depende dos padrões de serviço.
- AspireSQLEFCore.AppHost: um projeto de orquestrador projetado para conectar e configurar os diferentes projetos e serviços do seu aplicativo. O orquestrador deve ser definido como o projeto de inicialização.
- AspireSQLEFCore.ServiceDefaults: uma biblioteca de classes compartilhada para manter configurações que podem ser reutilizadas nos projetos em sua solução.
Criar o modelo de banco de dados e as classes de contexto
Para representar uma solicitação de suporte enviada pelo usuário, adicione a seguinte classe de modelo SupportTicket
na raiz do projeto 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;
}
Adicione a seguinte classe de contexto de dados
using Microsoft.EntityFrameworkCore;
using System.Reflection.Metadata;
namespace AspireSQLEFCore;
public class TicketContext(DbContextOptions options) : DbContext(options)
{
public DbSet<SupportTicket> Tickets => Set<SupportTicket>();
}
Adicionar a integração .NET Aspire ao aplicativo Blazor
Adicione o pacote de biblioteca
dotnet add package Aspire.Microsoft.EntityFrameworkCore.SqlServer
Seu projeto AspireSQLEFCore agora está configurado para usar as integrações .NET.NET Aspire. Aqui está o arquivo AspireSQLEFCore.csproj atualizado:
<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>
Configurar a integração .NET.NET Aspire
No arquivo
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();
Esse método realiza as seguintes tarefas:
- Registra um
TicketContext
com o contêiner de DI para se conectar ao Banco de Dados SQL Azure em contêineres. - Habilite automaticamente as verificações de integridade, o registro em log e a telemetria correspondentes.
Criar o banco de dados
Durante o desenvolvimento local, você precisa criar um banco de dados dentro do contêiner SQL Server. Atualize o arquivo Program.cs com o seguinte código:
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();
}
O código anterior:
- Verifica se o aplicativo está em execução em um ambiente de desenvolvimento.
- Se estiver, ele recuperará o serviço
TicketContext
do contêiner de DI e chamaráDatabase.EnsureCreated()
para criar o banco de dados se ele ainda não existir.
Nota
Observe que EnsureCreated()
não é adequado para ambientes de produção e cria apenas o banco de dados conforme definido no contexto. Ele não aplica migrações. Para obter mais informações sobre migrações de Entity Framework Core no .NET Aspire, consulte Aplicar migrações Entity Framework Core em .NET Aspire.
Criar o formulário
O aplicativo requer um formulário para que o usuário possa enviar informações do chamado de suporte e salvar a entrada no banco de dados.
Utilize a seguinte marcação Razor para criar um formulário básico, substituindo o conteúdo do arquivo Home.razor no diretório AspireSQLEFCore/Components/Pages.
@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();
}
}
Para obter mais informações sobre como criar formulários em Blazor, consulte ASP.NET CoreBlazor visão geral dos formulários.
Configurar o AppHost
O projeto AspireSQLEFCore.AppHost é o orquestrador do seu app. Ele é responsável por conectar e configurar os diferentes projetos e serviços do seu aplicativo. O orquestrador deve ser definido como o projeto de inicialização.
Adicione o pacote NuGet do
dotnet add package Aspire.Hosting.SqlServer
Substitua o conteúdo do arquivo Program.cs no projeto AspireSQLEFCore.AppHost pelo seguinte código:
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddSqlServer("sql")
.AddDatabase("sqldata");
builder.AddProject<Projects.AspireSQLEFCore>("aspiresql")
.WithReference(sql)
.WaitFor(sql);
builder.Build().Run();
O código anterior adiciona um recurso de contêiner SQL Server ao seu aplicativo e configura uma conexão com um banco de dados chamado sqldata
. As classes do Entity Framework configuradas anteriormente usarão automaticamente essa conexão ao migrar e se conectar ao banco de dados.
Executar e testar o aplicativo localmente
O aplicativo de exemplo agora está pronto para teste. Verifique se os dados de formulário enviados são mantidos no banco de dados concluindo as seguintes etapas:
Selecione o botão executar na parte superior do Visual Studio (ou F5) para iniciar seu painel de projeto .NET.NET Aspire no navegador.
Na página de projetos, na linha AspireSQLEFCore, clique no link na coluna pontos de extremidade para abrir a interface do usuário do aplicativo.
Insira dados de exemplo nos campos de formulário
Title
eDescription
.Selecione o botão Enviar e o formulário envia o tíquete de suporte para processamento ( em seguida, selecione Limpar para limpar o formulário).
Os dados enviados são exibidos na tabela na parte inferior da página quando a página é recarregada.