Przygotowanie do uzyskiwania dostępu do bazy danych MySQL za pomocą programu Entity Framework Core (najpierw baza danych)

Data utworzenia strony :

Środowisko potwierdzenia operacji

Visual Studio
  • informacji o wersji Visual Studio 2022
.SIEĆ
  • .NET 8
Entity Framework Core
  • Entity Framework Core 8.0
Język MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Powyższe jest środowiskiem weryfikacyjnym, ale może działać w innych wersjach.

Na początku

Entity Framework Core to biblioteka mapperów O/R, które umożliwiają dostęp do rekordów bazy danych za pośrednictwem modeli (klas) zdefiniowanych w kodzie bez bezpośredniego pisania instrukcji SQL podczas uzyskiwania dostępu do bazy danych. Zapewnia to następujące korzyści:

  • Nie zapisuje bezpośrednio instrukcji SQL, co zmniejsza zagrożenia bezpieczeństwa, takie jak wstrzykiwanie kodu SQL
  • Ponieważ instrukcje SQL są ciągami, nawet jeśli popełnią błąd w składni, nie podlegają sprawdzeniu pod kątem błędów kompilacji, ale ponieważ model jest składnią programu, można go sprawdzić pod kątem błędów w czasie kompilacji.

Entity Framework Core automatycznie generuje kod do nawiązywania połączenia z tymi modelami i bazami danych z istniejących baz danych, I odwrotnie, istnieje sposób na ręczne napisanie kodu, a następnie automatyczne wygenerowanie bazy danych.

Pierwsza z nich nazywa się "najpierw baza danych", a druga nazywa się "najpierw kod". Istnieje również funkcja "model-first", która generuje kod i bazy danych na podstawie strategii, takich jak diagramy ER, ale nie jest powszechnie używana w programie Entity Framework Core.

Tym razem użyjemy wzorca "database-first", który generuje kod przy założeniu, że baza danych już istnieje.

Konfiguracja MySQL

W tej wskazówce upewnij się, że wcześniej skonfigurowałeś MySQL, aby uzyskać dostęp do bazy danych MySQL. Można go skonfigurować na komputerze w środowisku programistycznym lub na innym komputerze za pośrednictwem sieci. Jeśli możesz połączyć się z MySQL ze swojego środowiska programistycznego, możesz zacząć. W tej wskazówce zainstalowaliśmy MySQL w innym środowisku.

Kroki konfiguracji MySQL zostaną pominięte, ponieważ będą nadmiarowe. Poniższe strony zawierają wskazówki dotyczące kroków konfiguracji związanych z MySQL.

Tworzenie tabeli

W takim przypadku utworzymy następujący schemat (bazę danych) i tabelę jako przykład.

  • Nazwa schematu : test_schema
  • Nazwa tabeli : user
  • Kolumny tabeli: [id], [imię i nazwisko], [hasło], [wiek], [e-mail], [urodziny], [is_provisional_registration], [update_datetime]

Nie ma znaczenia, jak to napiszesz, ale jeśli jest to żmudne, uruchom i wygeneruj następujący kod SQL w stosunku do MySQL:

Poniżej przedstawiono tworzenie schematu SQL:

CREATE DATABASE `test_schema`;

Tworzenie tabel odbywa się w języku 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='テストコメント';

Dodawanie rekordu do języka 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');

Ustawianie uprawnień dla swojego konta

Upewnij się, że masz skonfigurowaną nazwę hosta, aby programowane konto mogło uzyskać dostęp do schematu MySQL.

Musisz także ustawić uprawnienia dostępu do test_schema konta, z którym chcesz się połączyć.

Tym razem zajmiemy SELECT się procesem odzyskiwania rekordów. Tym razem tego nie zrobię, ale jeśli INSERT UPDATE chcesz wstawić lub zaktualizować, sprawdź i .

Konfiguracja programu Visual Studio

Zakładając, że już go skonfigurowałeś. Jeśli chcesz poznać procedurę konfiguracji, podsumowaliśmy ją na następnej stronie.

Tworzenie projektu

Entity Framework Core nie zależy od konkretnego środowiska wykonawczego, więc może być używany w wielu projektach. W takim przypadku użyjemy Entity Framework Core w prostym środowisku aplikacji konsolowej.

W nowym projekcie wybierz pozycję Aplikacja konsolowa (w zależności od tego, która z tych wartości nie jest .NET Framework).

Projekt został utworzony przez Ciebie. Nazwa projektu może być dowolna.

Pobierz pakiet Entity Framework Core dla programu MySQL

Pobierz pakiet do korzystania z programu Entity Framework Core z pakietem NuGet. W pakiecie wykorzystano: Nie jest to oficjalne od Microsoftu, ale jest szeroko stosowane.

  • Pomelo.EntityFrameworkCore.MySql

Kliknij prawym przyciskiem myszy zależność i wybierz polecenie Zarządzaj pakietami NuGet.

Po wybraniu opcji "Przeglądaj" na karcie wpisz w polu Pomelo wyszukiwania . Zostanie wyświetlona lista powiązanych pakietów.

Zainstaluj z tego następujące pakiety:

  • Pomelo.EntityFrameworkCore.MySql

Wybierz, co chcesz zainstalować, i kliknij przycisk Zainstaluj. Wybierz najnowszą stabilną wersję dla tej wersji.

Okno dialogowe jest w zasadzie OK i w porządku.

Myślę, że pakiet jest następujący.

Następnie wpisz EntityFrameworkCore w polu wyszukiwania i zainstaluj również następujące elementy.

  • Microsoft.EntityFrameworkCore.Tools

W przypadku wersji dopasuj wersję, Pomelo.EntityFrameworkCore.MySql do której Microsoft.EntityFrameworkCore odwołuje się . Tym razem odnosimy się do 8.0.2, więc Microsoft.EntityFrameworkCore.Tools zróbmy z tego również 8.0.2. Ten pakiet służy do generowania kodu z bazy danych.

Ostatecznie powinno to wyglądać tak:

Tworzenie modelu (kodu) na podstawie konfiguracji tabeli bazy danych

Aby model i inny kod zostały wygenerowane automatycznie, należy najpierw skompilować projekt, aby upewnić się, że nie ma żadnych błędów. Jeśli wystąpi błąd, model zakończy się niepowodzeniem. Jeśli już sprawdzono, że nie ma żadnych błędów, nie musisz kompilować.

Otwórz konsolę Menedżera pakietów z programu Visual Studio. Jeśli nie, możesz go otworzyć z menu Narzędzia, Menedżer pakietów NuGet i Konsola Menedżera pakietów.

Zobaczysz okno takie jak to poniżej, więc upewnij się, że "Domyślny projekt" w prawym górnym rogu to projekt, dla którego chcesz utworzyć model. (Musisz być ostrożny, jeśli masz wiele projektów)

Wprowadź następujący tekst w polu wprowadzania: Parametry będą się zmieniać w zależności od środowiska, dlatego należy je zmieniać w odpowiednim czasie w oparciu o poniższe wyjaśnienia.

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

Przykład danych wejściowych

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Wyjaśnienie parametru Przykład parametru
Dostawca Jeśli jest Pomelo.EntityFrameworkCore.MySql to MySQL, określ na przykład jak. Pomelo.EntityFrameworkCore.MySql
Połączenie Są to parametry połączenia do nawiązania połączenia z bazą danych. Parametry połączenia mogą być używane w innych aplikacjach, dlatego należy zapisać określoną zawartość zgodnie z notacją parametrów połączenia. Nawiasem mówiąc, jest on używany tylko tymczasowo do tworzenia modelu, więc nie ma potrzeby zdawać sobie sprawy z zabezpieczeń po opublikowaniu aplikacji dla tych parametrów połączenia. Jeśli w haśle znajduje się symbol, uważaj na ucieczkę. "Server=TestServer; Baza danych=test_schema; user=test-user; hasło=XXXXXXXX;"
f Wymuś nadpisanie, nawet jeśli masz już program. Brak <>
Katalog wyjściowy Ścieżka folderu do wyprowadzania kodu. Ścieżka względna z folderu projektu Modele\Baza danych
Kontekst Nazwy klas kontekstowych podczas korzystania z programu Entity Framework TestDatabaseDbContext
UseDatabaseNames (Nazwy baz danych) Jeśli zostanie określona, nazwa tabeli w bazie danych będzie nazwą klasy w takiej postaci, w jakiej jest. Jeśli nie, wielkość liter w nazwie klasy jednostki jest dostosowywana zgodnie z regułami. Brak <>
Adnotacje danych Jeśli zostanie określony, typ kolumny automatycznie dołącza atrybut DataAnnotation do każdej właściwości. Jest to nieco przydatne, jeśli chcesz automatycznie sprawdzać dane wejściowe zgodnie z typem bazy danych. Brak <>
Namespace Przestrzeń nazw, do której należy wygenerowana klasa jednostki. Jeśli nie zostanie określony, przestrzeń nazw jest określana zgodnie z folderem. TestNamespace (Przestrzeń nazw testów)
ContextNamespace (ContextNamespace) Przestrzeń nazw, do której należy wygenerowany kontekst. Jeśli nie zostanie określony, przestrzeń nazw jest określana zgodnie z folderem. TestNamespace (Przestrzeń nazw testów)
NoOnKonfiguracja Unikaj osadzania nieprzetworzonych parametrów połączenia w kodzie. Brak <>
NoPluralize Unikaj nazwy właściwości w liczbie mnogiej każdej nazwy tabeli w kontekście. Brak <>

Naciśnij Enter, aby go uruchomić i automatycznie wygenerować kod: Jeśli jest to błąd, zostanie wyświetlona przyczyna, więc odpowiedz zgodnie z treścią błędu.

user Kod modelu dla tabeli wygląda następująco:

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; }
}

Nawiasem mówiąc, ostrzeżenie jest wyświetlane, ponieważ parametry połączenia są zapisywane tak, jak w kodzie wygenerowanej klasy kontekstu. Jeśli to możliwe, parametry połączenia powinny być przechowywane w osobnym miejscu i ustawiane w czasie wykonywania, ale tym razem ma to na celu sprawdzenie operacji, więc zostawię ją taką, jaka jest.

Pobieranie rekordu i wyświetlanie go

Teraz, gdy masz już kod umożliwiający dostęp do rekordów w bazie danych, spróbujmy pobrać rekordy i wyświetlić je w konsoli.

Program.cs i zmodyfikuj go w następujący sposób.

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));
}

Wygeneruj automatycznie wygenerowaną DbContext klasę new za pomocą . Jest on zadeklarowany w, aby umożliwić using var automatyczne zniszczenie połączenia z bazą danych.

dbContext wygenerował właściwości umożliwiające dostęp do każdego modelu, więc tym razem user możesz manipulować rekordami w tabeli User , uzyskując dostęp do właściwości. Nie musisz znać kodu SQL, który jest wystawiany, ponieważ jest on automatycznie generowany wewnętrznie.

ToList Tutaj używamy user metody rozszerzenia, aby uzyskać wszystkie rekordy w tabeli.

foreach Następnie używam user metod i JsonSerializer.Serialize do wyświetlenia informacji w konsoli. Jak user wspomniano powyżej, każda kolumna w tabeli jest zadeklarowana jako właściwość, więc możliwe jest również indywidualne pobranie wartości.