Руководство. Подключение приложения 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 8.0 или .NET 9.0
- Контейнерная среда выполнения, совместимая с OCI, такая как:
- Docker рабочий стол или Podman. Для получения дополнительной информации смотрите контейнерную среду выполнения.
- Интегрированная среда разработки (IDE) или редактор кода, например:
- Visual Studio 2022 версии 17.9 или выше (необязательно)
-
Visual Studio Code (необязательно)
- C# Dev Kit: расширение (необязательно)
- JetBrains Rider с плагином .NET.NET Aspire (необязательно)
Дополнительные сведения см. в разделе .NET.NET Aspire настройки и инструментарияи .NET.NET Aspire пакета SDK.
Создание примера решения
- В верхней части Visual Studioперейдите к Файлу>Новый>Проект.
- В диалоговом окне найдите Blazor и выберите Blazor веб-приложение. Нажмите кнопку Далее.
- На экране Настройка нового проекта:
- Введите имя проекта из AspireSQLEFCore.
- Оставьте остальные значения по умолчанию и выберите Далее.
- На экране Дополнительные сведения:
- Убедитесь, что выбран .NET 9.0.
- Убедитесь, что для режима интерактивной отрисовки задано значение None.
- Выберите опцию enlist в .NET.NET Aspire оркестрации и нажмите Создать.
Visual Studio создает новое решение ASP.NET Core, структурированное для использования .NET Aspire. Решение состоит из следующих проектов:
- 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. Класс наследует 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 AspireEntity 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 проекта AspireSQLEFCore добавьте вызов метода расширения 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
в контейнере DI для подключения к контейнерной Azure базе данных SQL. - Автоматически включите соответствующие проверки работоспособности, ведение журнала и телеметрию.
Создание базы данных
При локальной разработке необходимо создать базу данных в контейнере 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();
}
Предыдущий код:
- Проверяет, работает ли приложение в среде разработки.
- Если это так, он извлекает службу
TicketContext
из контейнера DI и вызываетDatabase.EnsureCreated()
для создания базы данных, если она еще не существует.
Заметка
Обратите внимание, что EnsureCreated()
не подходит для рабочих сред, а она только создает базу данных, как определено в контексте. Не применяет никакие миграции. Дополнительную информацию о миграции Entity Framework Core в .NET Aspireсм. в : Применение миграций Entity Framework Core в .NET Aspire.
Создание формы
Приложению требуется форма для того, чтобы пользователь мог отправлять сведения о запросе в службу поддержки и сохранять запись в базе данных.
Используйте следующую разметку Razor для создания базовой формы, заменив содержимое файла Home.razor в каталоге AspireSQLEFCore/Components/Pages:
@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 является координатором вашего приложения. Он отвечает за подключение и настройку различных проектов и служб приложения. Оркестратор должен быть задан в качестве запускаемого проекта.
Добавьте пакет NuGet .NET Aspire Hosting Sql Server в проект AspireStorage.AppHost.
dotnet add package Aspire.Hosting.SqlServer
Замените содержимое файла Program.cs в проекте AspireSQLEFCore.AppHost следующим кодом:
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, настроенные ранее, автоматически будут использовать это подключение при миграции и подключении к базе данных.
Запуск и тестирование приложения локально
Пример приложения теперь готов к тестированию. Убедитесь, что отправленные данные формы сохраняются в базе данных, выполнив следующие действия:
Нажмите кнопку запуска в верхней части Visual Studio (или F5), чтобы запустить панель мониторинга проекта .NET.NET Aspire в браузере.
На странице проектов, в строке AspireSQLEFCore, щелкните ссылку в столбце конечных точек для открытия пользовательского интерфейса вашего приложения.
Введите примеры данных в поля формы
Title
иDescription
.Нажмите кнопку Отправить, а форма отправляет запрос в службу поддержки для обработки ( а затем нажмите кнопку Очистить, чтобы очистить форму).
Отправленные данные отображаются в таблице в нижней части страницы при перезагрузке страницы.
Закройте вкладки веб-браузера, которые отображают веб-приложение AspireSQL и панель мониторинга .NET.NET Aspire.
Переключитесь на Visual Studio и, чтобы остановить отладку, нажмите кнопку остановки или используйте комбинацию клавиш Шифт + F5.
Чтобы начать отладку во второй раз, нажмите кнопку запуска в верхней части Visual Studio (или F5).
На панели мониторинга .NET.NET Aspire на странице проектов в строке AspireSQLEFCore щелкните ссылку в столбце Конечные точки, чтобы открыть пользовательский интерфейс приложения.
Обратите внимание, что страница не отображает тикет, созданный в предыдущем сеансе.
Закройте вкладки веб-браузера, которые отображают веб-приложение AspireSQL и панель мониторинга .NET.NET Aspire.
Переключитесь на Visual Studio и, чтобы остановить отладку, нажмите кнопку остановки или используйте сочетание клавиш Shift + F5.
Сохранение данных во время перезапуска
Разработчики часто предпочитают сохранять данные во время перезапусков в среде разработки для более реалистичной базы данных для выполнения кода. Чтобы реализовать сохраняемость в .NET.NET Aspire, используйте метод WithDataVolume. Эти методы добавляют том Docker в контейнер базы данных, который не будет уничтожен при каждом перезапуске отладки.
В Visual Studioв проекте AspireSQLEFCore.AppHost дважды щелкните файл кода Program.cs.
Найдите следующий код:
var sql = builder.AddSqlServer("sql") .AddDatabase("sqldata");
Измените этот код, чтобы он соответствовал следующему:
var sql = builder.AddSqlServer("sql") .WithDataVolume() .AddDatabase("sqldata");
Запуск и проверка сохраняемости данных
Давайте рассмотрим, как объем данных изменяет поведение решения:
- Нажмите кнопку запуска в верхней части Visual Studio (или F5), чтобы запустить панель мониторинга проекта .NET.NET Aspire в браузере.
- На странице проектов, в строке AspireSQLEFCore, щелкните ссылку в столбце конечных точек для открытия пользовательского интерфейса вашего приложения.
- Введите примеры данных в поля формы
Title
иDescription
. - Нажмите кнопку Отправить, а форма отправляет запрос в службу поддержки для обработки ( а затем нажмите кнопку Очистить, чтобы очистить форму).
- Отправленные данные отображаются в таблице в нижней части страницы при перезагрузке страницы.
- Закройте вкладки веб-браузера, которые отображают веб-приложение AspireSQL и панель мониторинга .NET.NET Aspire.
- Переключитесь на Visual Studio и, чтобы остановить отладку, нажмите кнопку остановки или нажмите клавишу SHIFT + F5.
- Чтобы начать отладку во второй раз, нажмите кнопку запуска в верхней части Visual Studio (или F5).
- На панели мониторинга .NET.NET Aspire на странице проектов в строке AspireSQLEFCore щелкните ссылку в столбце Конечные точки, чтобы открыть пользовательский интерфейс приложения.
- Обратите внимание, что на странице теперь отображается билет, созданный в предыдущем сеансе.
См. также
.NET Aspire