Упражнение - Добавление 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 управления пиццами.

  1. В терминале создайте веб-API, выполнив dotnet new:

    dotnet new web -o PizzaStore -f net8.0
    

    Вы должны увидеть каталог PizzaStore.

  2. Перейдите в каталог PizzaStore , введя следующую команду:

    cd PizzaStore
    
  3. Установите пакет Swashbuckle:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    
  4. Откройте проект в Visual Studio Code.

  5. С помощью 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 для сопоставления этой модели данных с таблицей базы данных.

  6. Откройте 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.

  1. Нажмите клавиши CTRL+', чтобы открыть терминал в Visual Studio Code. В новом терминале введите следующий код, чтобы добавить пакет EF Core InMemory:

    dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 8.0
    
  2. Добавьте using Microsoft.EntityFrameworkCore; в верхнюю часть Program.cs и Pizza.cs файлов.

    Теперь, когда вы добавили EF Core в проект, вы можете связать код с данными, которые вы хотите сохранить, и запросить эти данные. Для этого необходимо создать класс PizzaDb. Класс PizzaDb выполняет следующие задачи:

    • Откройте доступ к свойству Pizzas из списка Pizza в базе данных.
    • Используйте UseInMemoryDatabase для подключения хранилища базы данных в оперативной памяти. Данные хранятся здесь до тех пор, пока приложение запущено.
  3. Чтобы настроить базу данных в памяти, добавьте следующий код в нижней части файла Pizza.cs (выше окончательного }). В пространстве имен PizzaStore.Models будет два определения классов.

    class PizzaDb : DbContext
    {
        public PizzaDb(DbContextOptions options) : base(options) { }
        public DbSet<Pizza> Pizzas { get; set; } = null!;
    }
    

    DbContext представляет подключение или сеанс, который используется для запроса и сохранения экземпляров сущностей в базе данных.

  4. Добавьте using PizzaStore.Models; в начало файла Program.cs .

  5. Перед вызовом AddSwaggerGenдобавьте следующий код в Program.cs:

    builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
    

Верните список элементов

  • Чтобы получить доступ к элементам из списка пиццы, добавьте следующий код перед вызовом app.Run();, чтобы добавить маршрут "/пиццы":

    app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
    

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

  1. Убедитесь, что вы сохранили все изменения. Запустите приложение, вызвав 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
    
  2. В браузере перейдите к https://localhost:{PORT}/swagger. Нажмите кнопку GET /pizzas, а затем Попробовать и Выполнить. Вы увидите, что список пуст под Response body.

  3. В терминале нажмите клавиши 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. Чтобы добавить новые элементы в список пиццы, выполните указанные ниже действия.

  1. Выберите POST /pizza.

  2. Выберите Попробовать.

  3. Замените текст запроса следующим кодом JSON:

    {
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
    }
    
  4. Выберите Выполнить.

Чтобы прочитать элементы в списке, выполните указанные ниже действия.

  1. Выберите GET /pizzas.

  2. Выберите Попробовать.

  3. Выберите Выполнить.

    Response body будет включать недавно добавленные элементы.

    [
      {
        "id": 1,
        "name": "Pepperoni",
        "description": "A classic pepperoni pizza"
      }
    ]
    
  4. Нажмите клавиши 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

  1. Выберите PUT /pizza/{id} в пользовательском интерфейсе Swagger.

  2. Выберите Попробовать.

  3. В текстовом поле идентификатора введите 1.

  4. Наконец, обновите Request body. Вставьте следующий код JSON и измените name на Pineapple.

    {
       "id": 1,
       "name": "Pineapple"
    }
    
  5. Выберите Выполнить.

Чтобы проверить код, прокрутите страницу назад до 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 и использовали базу данных в памяти для хранения данных. Далее вы узнаете, как использовать реальную базу данных для хранения данных, чтобы она сохранялась между завершением работы приложения.