Підготуйтеся до доступу до MySQL за допомогою Entity Framework Core (base-first)

Дата створення сторінки :

Середовище підтвердження роботи

Візуальна студія
  • Visual Studio 2022
.МЕРЕЖІ
  • .NET 8
Entity Framework Core
  • Entity Framework Core 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Вище наведено середовище верифікації, але воно може працювати і в інших версіях.

На перших порах

Entity Framework Core – це бібліотека O/R mappers, які дозволяють отримувати доступ до записів бази даних за допомогою кодово-визначених моделей (класів) без безпосереднього написання SQL-виразів при доступі до бази даних. Це дає наступні переваги:

  • Не пише SQL-вирази безпосередньо, знижуючи ризики безпеки, такі як SQL-ін'єкції
  • Так як SQL-вирази є рядками, то навіть якщо вони допускають помилку в синтаксисі, вони не підлягають перевірці на помилки збірки, але так як модель є синтаксисом програми, то її можна перевірити на наявність помилок під час збірки.

Entity Framework Core автоматично генерує код для підключення до цих моделей і баз даних з існуючих баз даних, І навпаки, є спосіб вручну написати код, а потім автоматично згенерувати базу даних.

Перший називається "database-first", а другий - "code-first". Існує також "model-first", який генерує код і бази даних з креслень, таких як діаграми ER, але він не широко використовується в Entity Framework Core.

Цього разу ми використаємо шаблон "database-first", який генерує код на основі припущення, що база даних вже існує.

Налаштування MySQL

У цій пораді переконайтеся, що ви заздалегідь налаштували MySQL для доступу до вашої бази даних MySQL. Його можна налаштувати на ПК у вашому середовищі розробки або на іншому ПК через мережу. Якщо ви можете підключитися до MySQL зі свого середовища розробки, все готово. У цій пораді ми встановили MySQL в іншому середовищі.

Кроки налаштування MySQL будуть пропущені, оскільки вони будуть зайвими. Наступні сторінки містять поради щодо етапів налаштування, пов'язаних з MySQL.

Створення таблиці

У цьому випадку ми створимо наступну схему (базу даних) і таблицю в якості зразка.

  • Ім'я схеми : test_schema
  • Ім'я таблиці : користувач
  • Стовпці таблиці: [id], [ім'я], [пароль], [вік], [email], [день народження], [is_provisional_registration], [update_datetime]

Не має значення, як ви це пишете, але якщо це нудно, запустіть і згенеруйте наступний SQL проти MySQL:

Нижче наведено створення схеми SQL:

CREATE DATABASE `test_schema`;

Створення таблиць здійснюється за допомогою SQL.

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `is_provisional_registration` tinyint(1) NOT NULL,
  `update_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';

Додайте запис до SQL.

INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');

Установлення дозволів для свого облікового запису

Переконайтеся, що у вас налаштовано ім'я хоста, щоб обліковий запис, який ви програмуєте, міг отримати доступ до схеми MySQL.

Вам також потрібно встановити дозволи на test_schema доступ до облікового запису, до якого ви хочете підключитися.

Цього разу ми виконаємо SELECT процес отримання записів. Цього разу я не буду цього робити, але якщо ви INSERT UPDATE хочете вставити або оновити, будь ласка, перевірте та .

Налаштування Visual Studio

Припускаючи, що ви вже налаштували його також. Якщо ви хочете дізнатися про процедуру налаштування, ми підсумували її на наступній сторінці.

Створити проект

Entity Framework Core не залежить від конкретного середовища виконання, тому його можна використовувати в багатьох проектах. У цьому випадку ми будемо використовувати Entity Framework Core в простому середовищі консольних додатків.

У новому проекті виберіть Console App (залежно від того, що не є .NET Framework).

Ви створили проект. Назва проекту може бути будь-якою.

Отримати пакет Entity Framework Core для MySQL

Отримайте пакет для використання Entity Framework Core з NuGet. У пакеті використовуються: Це не офіційно від Microsoft, але широко використовується.

  • Pomelo.EntityFrameworkCore.MySql

Клацніть правою кнопкою миші залежність і виберіть «Керування пакетами NuGet».

Вибравши "Огляд" на вкладці, введіть у поле Pomelo пошуку . З'явиться список пов'язаних пакетів.

Встановіть наступні пакети з цього:

  • Pomelo.EntityFrameworkCore.MySql

Виберіть, що ви хочете встановити, і натисніть кнопку Встановити. Виберіть останню стабільну версію для цієї версії.

Діалог в принципі нормальний і нормальний.

Я думаю, що пакет такий.

Потім введіть EntityFrameworkCore у поле пошуку та встановіть наступне.

  • Microsoft.EntityFrameworkCore.Tools

Для версій співставте версію, Pomelo.EntityFrameworkCore.MySql на яку Microsoft.EntityFrameworkCore посилається . Цього разу ми маємо на увазі 8.0.2, тому Microsoft.EntityFrameworkCore.Tools давайте зробимо і його 8.0.2. Цей пакет використовується для генерації коду з бази даних.

У підсумку це повинно виглядати наступним чином:

Створення моделі (коду) з конфігурації таблиці бази даних

Щоб ваша модель та інший код генерувалися автоматично, ви повинні спочатку побудувати свій проект, щоб переконатися у відсутності помилок. Якщо станеться помилка, модель вийде з ладу. Якщо ви вже переконалися у відсутності помилок, будувати не потрібно.

Відкрийте консоль диспетчера пакетів з Visual Studio. Якщо ні, ви можете відкрити його з меню «Інструменти», NuGet Менеджер пакетів і Консоль менеджера пакетів.

Ви побачите вікно, подібне до того, що нижче, тому переконайтеся, що "Проект за замовчуванням" у верхньому правому куті - це проект, для якого ви хочете створити модель. (Вам потрібно бути обережним, якщо у вас кілька проектів)

Введіть у поле введення такий текст: Параметри будуть змінюватися в залежності від середовища, тому, будь ласка, змінюйте їх своєчасно на основі наступних пояснень.

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Приклад введення

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Пояснення параметру Приклад параметра
Постачальника Якщо це Pomelo.EntityFrameworkCore.MySql MySQL, вкажіть такий, як. Pomelo.EntityFrameworkCore.MySql
Підключення Це рядок підключення для підключення до бази даних. Рядок з'єднання можна використовувати в інших програмах, тому, будь ласка, записуйте вказаний вміст відповідно до позначення рядка підключення. До речі, він використовується лише тимчасово для створення моделі, тому немає необхідності знати про безпеку після публікації програми для цього рядка підключення. Якщо у вашому паролі є символ, будьте обережні з втечею. "Server=TestServer; База даних=test_schema; user=test-user; password=XXXXXXXX;"
f Примусово перезаписуйте, навіть якщо у вас вже є програма. Без <>
OutputDir Шлях до папки для виведення коду. Відносний шлях до папки проекту Моделі\База даних
Контексті Імена контекстних класів при використанні Entity Framework TestDatabaseDbContext
UseDatabaseNames Якщо вказано, то ім'я таблиці в базі даних буде ім'ям класу в тому вигляді, в якому воно є. Якщо ні, то регістр імені класу сутності коригується відповідно до правил. Без <>
Анотації даних Якщо вказано, тип стовпця автоматично додає атрибут DataAnnotation до кожної властивості. Це трохи корисно, якщо ви хочете автоматично виконувати перевірку введення відповідно до типу бази даних. Без <>
Простір імен Простір імен, до якого належить згенерований клас сутності. Якщо не вказано, простір імен визначається відповідно до папки. Простір назв TestNames
ContextNamespace Простір імен, до якого належить згенерований контекст. Якщо не вказано, простір імен визначається відповідно до папки. Простір назв TestNames
NoOnConfiguring Уникайте вбудовування необроблених рядків з'єднання у ваш код. Без <>
НіМножина Уникайте назви властивості множини кожного імені таблиці в контексті. Без <>

Натисніть Enter, щоб запустити його та автоматично згенерувати код: Якщо це помилка, буде відображено причину, тому, будь ласка, дайте відповідь відповідно до вмісту помилки.

user Код моделі для таблиці виглядає так:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SetupMysqlDatabaseFirst.Models.Database;

/// <summary>
/// テストコメント
/// </summary>
public partial class user
{
  [Key]
  public int id { get; set; }

  [StringLength(20)]
  public string name { get; set; } = null!;

  [StringLength(20)]
  public string? password { get; set; }

  public int? age { get; set; }

  [StringLength(200)]
  public string? email { get; set; }

  public DateOnly? birthday { get; set; }

  public bool is_provisional_registration { get; set; }

  [Column(TypeName = "datetime")]
  public DateTime? update_datetime { get; set; }
}

До речі, попередження виводиться тому, що рядок підключення записується так, як він є в коді згенерованого контекстного класу. Якщо можливо, рядок підключення слід зберігати в окремому місці і встановлювати під час виконання, але цього разу це з метою перевірки роботи, тому я залишу все як є.

Отримайте запис і перегляньте його

Тепер, коли у вас є код для доступу до записів у базі даних, давайте спробуємо отримати записи та відобразити їх у консолі.

Program.cs і модифікувати його наступним чином.

using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;

Console.WriteLine("Hello, World!");

// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();

// データベースから User 一覧を取得する
var users = dbContext.user.ToList();

// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
  Console.WriteLine(JsonSerializer.Serialize(user));
}

Згенеруйте DbContext автоматично згенерований клас new за допомогою . Він оголошується для того, щоб дозволити using var автоматичне знищення з'єднання з базою даних.

dbContext згенерувала властивості для доступу до кожної моделі, тому цього разу user ви можете маніпулювати записами в таблиці User , звертаючись до властивостей. Вам не потрібно знати про SQL, який видається, оскільки він автоматично генерується внутрішньо.

ToList Тут ми використовуємо user метод розширення, щоб отримати всі записи в таблиці.

foreach Після цього я використовую user методи і JsonSerializer.Serialize для відображення інформації в консолі. Як user згадувалося вище, кожен стовпець у таблиці оголошується як властивість, тому також є можливість отримати значення окремо.