Поделиться через


Руководство. Подключение приложения 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 веб-приложение. Нажмите кнопку Далее.
  3. На экране Настройка нового проекта:
    • Введите имя проекта из AspireSQLEFCore.
    • Оставьте остальные значения по умолчанию и выберите Далее.
  4. На экране Дополнительные сведения:
    • Убедитесь, что выбран .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, настроенные ранее, автоматически будут использовать это подключение при миграции и подключении к базе данных.

Запуск и тестирование приложения локально

Пример приложения теперь готов к тестированию. Убедитесь, что отправленные данные формы сохраняются в базе данных, выполнив следующие действия:

  1. Нажмите кнопку запуска в верхней части Visual Studio (или F5), чтобы запустить панель мониторинга проекта .NET.NET Aspire в браузере.

  2. На странице проектов, в строке AspireSQLEFCore, щелкните ссылку в столбце конечных точек для открытия пользовательского интерфейса вашего приложения.

    Снимок экрана с домашней страницей приложения поддержки .NET.NET Aspire.

  3. Введите примеры данных в поля формы Title и Description.

  4. Нажмите кнопку Отправить, а форма отправляет запрос в службу поддержки для обработки ( а затем нажмите кнопку Очистить, чтобы очистить форму).

  5. Отправленные данные отображаются в таблице в нижней части страницы при перезагрузке страницы.

  6. Закройте вкладки веб-браузера, которые отображают веб-приложение AspireSQL и панель мониторинга .NET.NET Aspire.

  7. Переключитесь на Visual Studio и, чтобы остановить отладку, нажмите кнопку остановки или используйте комбинацию клавиш Шифт + F5.

  8. Чтобы начать отладку во второй раз, нажмите кнопку запуска в верхней части Visual Studio (или F5).

  9. На панели мониторинга .NET.NET Aspire на странице проектов в строке AspireSQLEFCore щелкните ссылку в столбце Конечные точки, чтобы открыть пользовательский интерфейс приложения.

  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. Нажмите кнопку запуска в верхней части Visual Studio (или F5), чтобы запустить панель мониторинга проекта .NET.NET Aspire в браузере.
  2. На странице проектов, в строке AspireSQLEFCore, щелкните ссылку в столбце конечных точек для открытия пользовательского интерфейса вашего приложения.
  3. Введите примеры данных в поля формы Title и Description.
  4. Нажмите кнопку Отправить, а форма отправляет запрос в службу поддержки для обработки ( а затем нажмите кнопку Очистить, чтобы очистить форму).
  5. Отправленные данные отображаются в таблице в нижней части страницы при перезагрузке страницы.
  6. Закройте вкладки веб-браузера, которые отображают веб-приложение AspireSQL и панель мониторинга .NET.NET Aspire.
  7. Переключитесь на Visual Studio и, чтобы остановить отладку, нажмите кнопку остановки или нажмите клавишу SHIFT + F5.
  8. Чтобы начать отладку во второй раз, нажмите кнопку запуска в верхней части Visual Studio (или F5).
  9. На панели мониторинга .NET.NET Aspire на странице проектов в строке AspireSQLEFCore щелкните ссылку в столбце Конечные точки, чтобы открыть пользовательский интерфейс приложения.
  10. Обратите внимание, что на странице теперь отображается билет, созданный в предыдущем сеансе.

См. также