Tutorial: Conectar um aplicativo ASP.NET Core a SQL Server usando .NET Aspire e Entity Framework Core
Neste tutorial, crias uma aplicação ASP.NET Core que utiliza uma integração de .NET AspireEntity Framework CoreSQL Server para conectar-se a SQL Server e ler e gravar dados de bilhetes de suporte. Entity Framework Core é um mapeador objeto-relacional leve, extensível e de código aberto que permite que os desenvolvedores .NET trabalhem com bancos de dados usando objetos .NET. Você aprenderá a:
- Criar um aplicativo .NET básico configurado para usar integrações .NET Aspire
- Adicione uma integração .NET Aspire para se conectar ao SQL Server
- Configurar e usar os recursos do .NET.NET Aspire Component para ler e gravar a partir do 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 tempo de execução de contêiner compatível com OCI, como:
- Docker Desktop ou Podman. Para obter mais informações, consulte Container runtime.
- Um ambiente de desenvolvedor integrado (IDE) ou 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 configuração e ferramentas e .NET.NET Aspire SDK.
Criar a solução de exemplo
- No topo de Visual Studio, navegue até Ficheiro>Novo>Projeto.
- Na janela de diálogo, procure Blazor e selecione Blazor Web App. Escolha Próximo.
- No ecrã Configura o novo projeto:
- Insira um Nome do Projeto de AspireSQLEFCore.
- Deixe a rest dos valores nos seus valores predefinidos e selecione Seguinte.
- No ecrã de Informações adicionais :
- Certifique-se de .NET 9.0 está selecionado.
- Verifique se o modo de renderização interativo está definido como Nenhum.
- Marque a opção Inscrever-se em .NET.NET Aspire orquestração e selecione Criar.
Visual Studio cria uma solução nova de ASP.NET Core que está estruturada para usar .NET Aspire. A solução consiste nos seguintes projetos:
- AspireSQLEFCore: Um projeto Blazor que depende das configurações padrão de serviço.
- AspireSQLEFCore.AppHost: Um projeto orquestrador projetado para conectar e configurar os diferentes projetos e serviços do seu aplicativo. O orquestrador deve ser definido como o projeto de arranque.
- AspireSQLEFCore.ServiceDefaults: Uma biblioteca de classes compartilhada para armazenar configurações que podem ser reutilizadas em todos os projetos em sua solução.
Criar o modelo de banco de dados e as classes de contexto
Para representar um pedido de suporte enviado pelo utilizador, adicione a seguinte classe de modelo SupportTicket
à 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 TicketDbContext
na raiz do projeto AspireSQLEFCore. A classe herda System.Data.Entity.DbContext para trabalhar com o Entity Framework e representar seu banco 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 .NET AspireEntity Framework CoreServer Sql ao seu projeto AspireSQLEFCore.
dotnet add package Aspire.Microsoft.EntityFrameworkCore.SqlServer
Seu projeto AspireSQLEFCore agora está configurado para usar 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 de .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();
Este método realiza as seguintes tarefas:
- Registra um
TicketContext
com o contêiner DI para conexão com o Banco de dados SQL Azure conteinerizado. - Habilite automaticamente as verificações de integridade, registro e telemetria correspondentes.
Criar a base de dados
Ao desenvolver localmente, 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á sendo executado em um ambiente de desenvolvimento.
- Se estiver, ele recupera o serviço
TicketContext
do contêiner DI e chamaDatabase.EnsureCreated()
para criar o banco de dados, caso ele ainda não exista.
Observação
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 nenhuma migração. Para obter mais informações sobre migrações de Entity Framework Core no .NET Aspire, consulte para aplicar migrações de Entity Framework Core no .NET Aspire.
Criar o formulário
A aplicação requer um formulário para que o utilizador possa enviar informações de tíquete de suporte e guardar a entrada na base de dados.
Utilize a seguinte marcação Razor para criar um formulário básico, substituindo o conteúdo do ficheiro 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 no Blazor, consulte ASP.NET CoreBlazor visão geral de formulários.
Configurar o AppHost
O projeto AspireSQLEFCore.AppHost é o orquestrador da sua aplicação. 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 .NET Aspire Hosting Sql Server NuGet ao seu projeto AspireStorage.AppHost.
dotnet add package Aspire.Hosting.SqlServer
Substitua o conteúdo do arquivo
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 de 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 do formulário enviado persistem no banco de dados concluindo as seguintes etapas:
Selecione o botão Executar na parte superior do Visual Studio (ou F5) para iniciar o painel do 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 seu 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.