Упражнение - Добавление EF Core к минимальному API
Вы разработчик компании, и вы и ваша компания слышали о новом минимальном API. Ваш менеджер попросил вас создать проект для него, чтобы обсудить, следует ли использовать его в следующем проекте.
Заметка
Этот модуль использует интерфейс командной строки .NET (интерфейс командной строки) и Visual Studio Code для локальной разработки. После выполнения этого модуля можно применить основные понятия с помощью Visual Studio (Windows), Visual Studio для Mac (macOS) или продолжить разработку с помощью Visual Studio Code (Windows, Linux, & macOS).
В этом модуле используется пакет SDK для .NET 8.0. Убедитесь, что установлен .NET 8.0, выполнив следующую команду в предпочтительном терминале команд:
dotnet --list-sdks
Выходные данные, аналогичные следующему примеру, отображаются:
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
Убедитесь, что указана версия, которая начинается с 8
. Если ни один из них не перечислен или команда не найдена, установите последнюю версию SDK для .NET 8.0.
Настройка проекта
Сначала необходимо создать проект. Вы установили .NET 6, и готовы начать. В этом уроке вы добавите сохраняемость данных в API управления пиццами.
В терминале создайте веб-API, выполнив
dotnet new
:dotnet new web -o PizzaStore -f net8.0
Вы должны увидеть каталог PizzaStore.
Перейдите в каталог PizzaStore , введя следующую команду:
cd PizzaStore
Установите пакет Swashbuckle:
dotnet add package Swashbuckle.AspNetCore --version 6.5.0
Откройте проект в Visual Studio Code.
С помощью Visual Studio Code создайте файл Pizza.cs в корневом каталоге проекта и предоставьте ему следующее содержимое:
namespace PizzaStore.Models { public class Pizza { public int Id { get; set; } public string? Name { get; set; } public string? Description { get; set; } } }
Предыдущий
Pizza
класс — это простой объект, представляющий пиццу. Этот код — это модель данных. Позже вы будете использовать Entity Framework (EF) Core для сопоставления этой модели данных с таблицей базы данных.Откройте Program.cs и добавьте выделенный код:
using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "PizzaStore API", Description = "Making the Pizzas you love", Version = "v1" }); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "PizzaStore API V1"); }); } app.MapGet("/", () => "Hello World!"); app.Run();
Вы можете получить запрос от программы Visual Studio Code, чтобы добавить элементы для отладки проекта. Выберите
Yes
в диалоговом окне.
Добавление EF Core в проект
Чтобы сохранить элементы в списке to-do, установите пакет EntityFrameworkCore.InMemory
.
Нажмите клавиши CTRL+', чтобы открыть терминал в Visual Studio Code. В новом терминале введите следующий код, чтобы добавить пакет EF Core InMemory:
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0
Добавьте
using Microsoft.EntityFrameworkCore;
в верхнюю часть Program.cs и Pizza.cs файлов.Теперь, когда вы добавили EF Core в проект, вы можете связать код с данными, которые вы хотите сохранить, и запросить эти данные. Для этого необходимо создать класс
PizzaDb
. КлассPizzaDb
выполняет следующие задачи:- Откройте доступ к свойству
Pizzas
из спискаPizza
в базе данных. - Используйте
UseInMemoryDatabase
для подключения хранилища базы данных в оперативной памяти. Данные хранятся здесь до тех пор, пока приложение запущено.
- Откройте доступ к свойству
Чтобы настроить базу данных в памяти, добавьте следующий код в нижней части файла Pizza.cs (выше окончательного
}
). В пространстве именPizzaStore.Models
будет два определения классов.class PizzaDb : DbContext { public PizzaDb(DbContextOptions options) : base(options) { } public DbSet<Pizza> Pizzas { get; set; } = null!; }
DbContext
представляет подключение или сеанс, который используется для запроса и сохранения экземпляров сущностей в базе данных.Добавьте
using PizzaStore.Models;
в начало файла Program.cs .Перед вызовом
AddSwaggerGen
добавьте следующий код в Program.cs:builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
Верните список элементов
Чтобы получить доступ к элементам из списка пиццы, добавьте следующий код перед вызовом
app.Run();
, чтобы добавить маршрут "/пиццы":app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
Запуск приложения
Убедитесь, что вы сохранили все изменения. Запустите приложение, вызвав
dotnet run
в терминале. Это действие создаст приложение и разместит его на порту от 5000 до 5300. HTTPS будет иметь порт, выбранный для него в диапазоне 7000–7300.Заметка
Если вы хотите переопределить поведение выбора случайных портов, можно задать порты для использования в launchSettings.json.
dotnet run
Вот как выглядеть выходные данные в терминале:
Building... info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7200 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5100 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /<path>/PizzaStore
В браузере перейдите к https://localhost:{PORT}/swagger. Нажмите кнопку
GET /pizzas
, а затем Попробовать и Выполнить. Вы увидите, что список пуст подResponse body
.В терминале нажмите клавиши CTRL+C , чтобы остановить выполнение программы.
Создание новых элементов
Давайте добавим POST
новые элементы в список пицц. В Program.csдобавьте следующий код под app.MapGet
, который вы создали ранее.
app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
await db.Pizzas.AddAsync(pizza);
await db.SaveChangesAsync();
return Results.Created($"/pizza/{pizza.Id}", pizza);
});
Тестирование API
Убедитесь, что вы сохранили все изменения и снова запустите приложение. Вернитесь к пользовательскому интерфейсу Swagger, и теперь вы увидите POST/pizza
. Чтобы добавить новые элементы в список пиццы, выполните указанные ниже действия.
Выберите POST /pizza.
Выберите Попробовать.
Замените текст запроса следующим кодом JSON:
{ "name": "Pepperoni", "description": "A classic pepperoni pizza" }
Выберите Выполнить.
Чтобы прочитать элементы в списке, выполните указанные ниже действия.
Выберите GET /pizzas.
Выберите Попробовать.
Выберите Выполнить.
Response body
будет включать недавно добавленные элементы.[ { "id": 1, "name": "Pepperoni", "description": "A classic pepperoni pizza" } ]
Нажмите клавиши CTRL+C в терминале, чтобы остановить запуск приложения. Для остальных этих упражнений остановите и перезапустите приложение, чтобы протестировать изменения. Не забудьте сохранить все изменения, прежде чем
dotnet run
!
Получите один элемент
Чтобы получить элемент id
, добавьте код в маршрут app.MapPost
, созданный ранее.
app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));
Проверка GET по идентификатору
Чтобы протестировать эту операцию, можно перейти к https://localhost:{PORT}/pizza/1 или использовать пользовательский интерфейс Swagger. Так как вы используете базу данных в памяти, созданная ранее пицца не будет указана, если вы перезагрузили приложение. Таким образом, вам потребуется использовать операцию POST, чтобы снова добавить ее.
Обновление элемента
Чтобы обновить существующий элемент, добавьте код в созданный маршрут GET /pizza/{id}
:
app.MapPut("/pizza/{id}", async (PizzaDb db, Pizza updatepizza, int id) =>
{
var pizza = await db.Pizzas.FindAsync(id);
if (pizza is null) return Results.NotFound();
pizza.Name = updatepizza.Name;
pizza.Description = updatepizza.Description;
await db.SaveChangesAsync();
return Results.NoContent();
});
Тестирование PUT
Выберите PUT /pizza/{id} в пользовательском интерфейсе Swagger.
Выберите Попробовать.
В текстовом поле идентификатора введите 1.
Наконец, обновите
Request body
. Вставьте следующий код JSON и изменитеname
наPineapple
.{ "id": 1, "name": "Pineapple" }
Выберите Выполнить.
Чтобы проверить код, прокрутите страницу назад до GET /pizza/{id}
. Пицца теперь имеет имя Pineapple
.
Удаление элемента
Чтобы удалить существующий элемент, добавьте код под PUT /pizza/{id}
, который вы создали ранее.
app.MapDelete("/pizza/{id}", async (PizzaDb db, int id) =>
{
var pizza = await db.Pizzas.FindAsync(id);
if (pizza is null)
{
return Results.NotFound();
}
db.Pizzas.Remove(pizza);
await db.SaveChangesAsync();
return Results.Ok();
});
Тестирование «DELETE»
Теперь попробуйте удалить элемент с помощью интерфейса Swagger.
В этом уроке вы добавили EF Core в существующее минимальное приложение API и использовали базу данных в памяти для хранения данных. Далее вы узнаете, как использовать реальную базу данных для хранения данных, чтобы она сохранялась между завершением работы приложения.