Entity Framework ❤️ MySQL

Entity Framework ❤️ MySQL

@iksergeyru

Пошаговая инструкция "Написание простого сервиса с базой данных"

C#, MySQL, ORM Entity Framework

Возможно заинтересует:

В демонстрации используется
ПАКЕТ SDK ДЛЯ .NET: Version:  7.0.102
OS Name:  Mac OS X
OS Version: 13.1
MySQL Ver 8.0.31 for Linux on aarch64 (MySQL Community Server - GPL)MySQL. Workbench 8.0, Version 8.0.31 build 2235049 CE (64 bits) Community
Docker version 20.10.21


Шаг 1. Установить и настроить MySQL. Я буду использовать "MySQL & Docker: быстрый старт" (инструкция выше)

Шаг 2. Создать новый ASP.NET Core Web API проект. Для этого в терминале прописываем dotnet new webapi

Рис. 1 Структура созданного проекта

Удалим файлы: WeatherForecastController.cs, WeatherForecast.cs

Добавим папки: Models, Data

Рис. 2 Структура папок

Шаг 3. Установим две библиотеки, необходимых для работы

  1. Библиотека Pomelo.EntityFrameworkCore.MySql поставщик Entity Framework Core (EF Core) для работы с MySQL, для установки в терминале введём
    dotnet add package Pomelo.EntityFrameworkCore.MySql
    (Project website)
  2. Библиотека общих компонент разработки для инструментов EF Core – Microsoft.EntityFrameworkCore.Design, для установки в терминале введём
    dotnet add package Microsoft.EntityFrameworkCore.Design (Project website)

Шаг 4. В папке Models создадим две файла

  • Employee.cs – модель сотрудника
  • Department.cs – модель департамента

Содержимое Employee.cs

public class Employee
{
  public int Id { get; set; }
  public int Salary { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public int DepartmentId { get; set; }
}

Содержимое Department.cs

public class Department
{
  public int Id { get; set; }
  public string Title { get; set; }
}

Шаг 5. В папке Data создадим класс, отвечающий за работу с данными DataContext.cs со следующим содержимым:

using Microsoft.EntityFrameworkCore;

public class DataContext : DbContext
{
  public DbSet<Employee> employees { get; set; }
  public DbSet<Department> departments { get; set; }

  public DataContext(DbContextOptions<DataContext> op)
  : base(op) { }
}

Шаг 6. Изменим содержимое файла appsettings.json

с

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

на

{
  "ConnectionStrings": {
    "MySqlStringConnection": "server=localhost;user=root;password=12345678;database=ProfInc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Добавив строку подключения со всей необходимой информацией для подключения.

Шаг 7. Устанавливаем / настраиваем средства для работы с EF посредствам командной строки (делается один раз, на Windows, как правило, настраивается автоматически при установке SDK или Visual Studio)

  • .NET 7: dotnet tool install --global dotnet-ef
  • .NET 6: dotnet tool install --global dotnet-ef --version 6.*

Полезные ссылки

Перезагружаем терминал

Шаг 8. В файле Program.cs добавляем настройку работы с данными

builder.Services.AddDbContext<DataContext>(op =>
{
op.UseMySql(builder.Configuration.GetConnectionString("MySqlStringConnection"),
new MySqlServerVersion(new Version(8, 0, 31)));
});

"MySqlStringConnection" тут это имя строки-подключения из файла appsettings.json добавленное на шаге 6.

Шаг 9. В терминале выполняем
dotnet ef migrations add initial-migration 

Через некоторое время в проводнике должно быть сообщено об успешном выполнении

$ dotnet ef migrations add initial-migration
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'

В структуре проекта должна появиться папка Migrations – её не удалять.

Выполняем вторую команду
dotnet ef database update  

Ждём, пока в терминале появится "Done".

...
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
    Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
    INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
    VALUES ('20230329230317_initial-migration', '7.0.4');
Done.

~/Developer/DotnetMySQLEF $:

в терминале будет лог произошедшего – первый раз рекомендую изучить.

В структуре проекта будет нечто похожее

Рис 3. Структура проекта после манипуляций с миграциями

Миграции Entity Framework – это механизм автоматического обновления базы данных при изменении модели данных в приложении, которое использует Entity Framework.

Когда вы вносите изменения в модель данных, например, добавляете новую таблицу или изменяете существующую, миграции Entity Framework автоматически генерируют набор скриптов, которые могут обновить схему базы данных, чтобы соответствовать новой модели данных.

Вы можете применить эти миграции к вашей базе данных, чтобы обновить ее до последней версии схемы данных. Это позволяет вам изменять модель данных в приложении без необходимости ручного внесения изменений в базу данных.

Миграции Entity Framework обеспечивают более безопасную и предсказуемую работу с базой данных, позволяя вам легко изменять модель данных и применять эти изменения к базе данных без необходимости ручного изменения схемы.

Entity Framework (EF) – это технология объектно-ориентированного доступа к данным (Object-Relational Mapping, ORM) для платформы .NET.

Он позволяет разработчикам взаимодействовать с базами данных через объекты в коде, скрывая детали работы с базой данных, такие как создание SQL-запросов и управление соединениями с базой данных.

Entity Framework поддерживает работу с различными системами управления базами данных (MS SQL Server, MySQL, Oracle и другими), что облегчает создание многоплатформенных приложений.

С помощью EF можно создавать модели данных и работать с ними на уровне объектов, взаимодействуя с ними как с обычными объектами .NET. EF также предоставляет возможности для выполнения запросов к базе данных, сохранения изменений в базе данных и управления транзакциями.

Entity Framework предоставляет мощный и гибкий подход к работе с данными в .NET-приложениях и является одним из наиболее популярных ORM-фреймворков для .NET.

дополнительная информация на сайте MSFT


Шаг 10. Открываем любой клиент для просмотра MySQL баз данных. Должна появиться база с именем, указанным на шаге 6 (database=ProfInc), содержащая таблицы

Рис. 4 MySQL. Workbench 8.0, Version 8.0.31 build 2235049 CE (64 bits) Community

Подготовка окончена.

Шаг 11. Опишем два контроллера для работы с таблицами

В папке Controllers создадим два контроллера: DepartmentController.cs, EmployeeController.cs.

В контроллере DepartmentController опишем два EndPoint'а – для добавления департамента и для получения департамента по id

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[ApiController]
[Route("[controller]")]
public class DepartmentController : ControllerBase
{
  private readonly DataContext context;
  public DepartmentController(DataContext context)
  {
    this.context = context;
  }

  [HttpGet]
  public async Task<ActionResult<Department>> Get(int id)
  {
    return await
      context.departments
             .Where(e => e.Id == id)
             .FirstOrDefaultAsync();
  }

  [HttpPost]
  public async Task<ActionResult<Department>> Create(Department department)
  {
    context.departments.Add(department);
    await context.SaveChangesAsync();
    return await Get(department.Id);
  }
}

В контроллере EmployeeController опишем два EndPoint'а – для добавления сотрудника и для получения сотрудника по id

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[ApiController]
[Route("[controller]")]
public class EmployeeController : ControllerBase
{
  private readonly DataContext context;

  public EmployeeController(DataContext context)
  {
    this.context = context;
  }

  [HttpGet]
  public async Task<ActionResult<Employee>> Get(int id)
  {
    return await context.employees
                  .Where(item => item.Id == id)
                  .FirstOrDefaultAsync();
  }

  [HttpPost]
  public async Task<ActionResult<Employee>> Create(Employee worker)
  {
    context.employees.Add(worker);
    await context.SaveChangesAsync();
    return await Get(worker.Id);
  }
}

Шаг 12. Выполняем сборку проекта dotnet run

в терминале будет адрес сервиса

info: Microsoft.Hosting.Lifetime[14]
   Now listening on: http://localhost:5298
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: /Users/i/Developer/DotnetMySQLEF

Переходим на http://localhost:5298/swagger

Должно быть что-то похожее

Рис 5. Почти готово

Шаг 13. Проверяем Post /Departament для добавления департамента

Демонстрация добавления департаментов

Сотрудники добавляются аналогично

Шаг 14. Убеждаемся, что данные добавляются выполняя GET запросы, либо в клиенте MySQL

USE ProfInc;
SELECT 
 * 
FROM departments;
Рис.6 Результат выполнения.

Полезные ссылки

Исходники на 🔗GitHub

Видео – URL


Report Page