Förbereda för åtkomst till MySQL med Entity Framework Core (databas först)

Datum för skapande av sida :

Miljö för driftbekräftelse

Visuell Studio
  • Visual Studio 2022
.NÄT
  • .NET 8
Kärna för entitetsramverk
  • Entity Framework Core 8.0
MySQL (på engelska)
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Ovanstående är en verifieringsmiljö, men den kan fungera i andra versioner.

Först

Entity Framework Core är ett bibliotek med O/R-mappningar som gör att du kan komma åt databasposter via koddefinierade modeller (klasser) utan att direkt skriva SQL-satser när du kommer åt databasen. Detta ger följande fördelar:

  • Skriver inte SQL-instruktioner direkt, vilket minskar säkerhetsrisker som SQL-inmatning
  • Eftersom SQL-satser är strängar, även om de gör ett misstag i syntaxen, är de inte föremål för kontroll av byggfel, men eftersom modellen är en programsyntax kan den kontrolleras för fel vid byggtiden.

Entity Framework Core genererar automatiskt kod för att ansluta till dessa modeller och databaser från befintliga databaser, Omvänt finns det ett sätt att manuellt skriva kod och sedan automatiskt generera en databas.

Den förstnämnda kallas "databas-först" och den senare kallas "kod-först". Det finns också "model-first" som genererar kod och databaser från ritningar, till exempel ER-diagram, men det används inte i stor utsträckning i Entity Framework Core.

Den här gången använder vi ett "databas-först"-mönster som genererar kod under antagandet att det redan finns en databas.

MySQL-inställning

I det här tipset, se till att du ställer in MySQL i förväg för att komma åt din MySQL-databas. Den kan ställas in på en dator i din utvecklingsmiljö eller på en annan dator över nätverket. Om du kan ansluta till MySQL från din utvecklingsmiljö är du bra att gå. I det här tipset har vi installerat MySQL i en annan miljö.

Installationsstegen för MySQL kommer att utelämnas eftersom de kommer att vara överflödiga. Följande sidor innehåller MySQL-relaterade tips för installationssteg.

Skapa en tabell

I det här fallet skapar vi följande schema (databas) och tabell som ett exempel.

  • Schemanamn : test_schema
  • Tabellnamn : användare
  • Tabellkolumner: [id], [namn], [lösenord], [ålder], [e-post], [födelsedag], [is_provisional_registration], [update_datetime]

Det spelar ingen roll hur du skriver det, men om det är tråkigt, kör och generera följande SQL mot MySQL:

Följande är SQL för att skapa scheman:

CREATE DATABASE `test_schema`;

Att skapa tabeller är 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='テストコメント';

Lägga till en post i 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');

Ange behörigheter för ditt konto

Kontrollera att du har ett värdnamn konfigurerat så att det konto som du programmerar kan komma åt MySQL-schemat.

Du måste också ställa in behörigheter för att test_schema komma åt det konto du vill ansluta till.

Den här gången kommer vi att utföra SELECT processen med att hämta posterna. Jag kommer inte att göra det den här gången, men om du INSERT UPDATE vill infoga eller uppdatera, kontrollera och .

Konfiguration av Visual Studio

Förutsatt att du redan har ställt in det också. Om du vill veta installationsproceduren har vi sammanfattat den på följande sida.

Skapa ett projekt

Entity Framework Core är inte beroende av en specifik körningsmiljö, så den kan användas i många projekt. I det här fallet använder vi Entity Framework Core i en enkel konsolprogrammiljö.

I det nya projektet väljer du Konsolapp (beroende på vilket som inte är .NET Framework).

Du har skapat projektet. Projektnamnet kan vara vad som helst.

Hämta Entity Framework Core-paketet för MySQL

Hämta ett paket för att använda Entity Framework Core med NuGet. Paketet använder: Detta är inte officiellt från Microsoft, men det används i stor utsträckning.

  • Pomelo.EntityFrameworkCore.MySql

Högerklicka på beroendet och välj Hantera NuGet-paket.

Med "Bläddra" valt från fliken, skriv i sökfältet Pomelo . Listan över relaterade paket kommer att visas.

Installera följande paket från detta:

  • Pomelo.EntityFrameworkCore.MySql

Välj vad du vill installera och klicka på knappen Installera. Välj den senaste stabila versionen för versionen.

Dialogen är i princip OK och bra.

Jag anser att paketet är följande.

Skriv EntityFrameworkCore sedan i sökfältet och installera följande också.

  • Microsoft.EntityFrameworkCore.Tools

För versioner matchar du Pomelo.EntityFrameworkCore.MySql den version som refereras Microsoft.EntityFrameworkCore av . Den här gången hänvisar vi till 8.0.2, så Microsoft.EntityFrameworkCore.Tools låt oss göra det 8.0.2 också. Det här paketet används för att generera kod från databasen.

I slutändan ska det se ut så här:

Skapa en modell (kod) från en databastabellkonfiguration

Om du vill att din modell och annan kod ska genereras automatiskt måste du först skapa projektet för att se till att det inte finns några fel. Om det finns ett fel kommer modellen att misslyckas. Om du redan har kontrollerat att det inte finns några fel behöver du inte bygga.

Öppna Package Manager-konsolen från Visual Studio. Annars kan du öppna den från menyn Verktyg, NuGet Package Manager och Package Manager Console.

Du kommer att se ett fönster som det nedan, så se till att "Standardprojekt" i det övre högra hörnet är det projekt du vill skapa modellen för. (Du måste vara försiktig om du har flera projekt)

Ange följande text i inmatningsfältet: Parametrarna kommer att ändras beroende på miljön, så ändra dem i tid baserat på följande förklaringar.

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

Exempel på inmatning

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Parameter Förklaring Exempel på parameter
Familjeförsörjare Om det är Pomelo.EntityFrameworkCore.MySql MySQL anger du t.ex. Pomelo.EntityFrameworkCore.MySql
Samband Det här är συμβολοσειρά σύν� Συμβολοσειρά σύνδεσης kan användas i andra appar, så skriv det angivna innehållet enligt notationen för συμβολοσει� Förresten, den används bara tillfälligt för att skapa en modell, så det finns ingen anledning att vara medveten om säkerheten när du har publicerat appen för den här anslutningssträngen. Om du har en symbol i ditt lösenord, var försiktig med escape. "Server=TestServer; Databas = test_schema; användare = test-användare; lösenord = XXXXXXXX;
f Tvinga överskrivning även om du redan har ett program. Inga <>
OutputDir Mappsökvägen för att mata ut koden. Relativ sökväg från projektmappen Modeller\Databas
Sammanhang Kontextklassnamn när du använder Entity Framework TestDatabaseDbContext
UseDatabaseNames (på engelska) Om det anges kommer tabellnamnet i databasen att vara klassnamnet som det är. Om inte, justeras fallet med enhetsklassens namn enligt reglerna. Inga <>
DataAnnoteringar Om det anges lägger kolumntypen automatiskt till attributet DataAnnotation i varje egenskap. Detta är lite användbart om du automatiskt vill göra inmatningskontroll beroende på typen av databas. Inga <>
Namespace Det namnområde som den genererade entitetsklassen tillhör. Om inget anges bestäms namnområdet enligt mappen. TestNamespace (på engelska)
Kontextnamnrymd Det namnområde som den genererade kontexten tillhör. Om inget anges bestäms namnområdet enligt mappen. TestNamespace (på engelska)
NoOnKonfigurera Undvik att bädda in råa anslutningssträngar i koden. Inga <>
NejPluralisera Undvik plural egenskapsnamn för varje tabellnamn i kontexten. Inga <>

Tryck på Retur för att köra den och generera koden automatiskt: Om det är ett fel kommer orsaken att visas, så svara enligt innehållet i felet.

user Modellkoden för tabellen ser ut så här:

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

Förresten, varningen visas eftersom anslutningssträngen är skriven som den är i koden för den genererade kontextklassen. Om möjligt bör anslutningssträngen lagras på en separat plats och ställas in vid körning, men den här gången är det för att kontrollera åtgärden, så jag lämnar den som den är.

Hämta en post och visa den

Nu när du har koden för att komma åt posterna i databasen ska vi försöka hämta posterna och visa dem i konsolen.

Program.cs och ändra den enligt följande.

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

Generera den DbContext automatiskt genererade klassen new med . Den deklareras för att tillåta using var att databasanslutningen förstörs automatiskt.

dbContext har genererat egenskaper för att komma åt varje modell, så den här gången user kan du manipulera posterna i tabellen genom User att komma åt egenskaperna. Du behöver inte vara medveten om den SQL som utfärdas eftersom den genereras automatiskt internt.

ToList Här använder user vi en tilläggsmetod för att hämta alla poster i tabellen.

foreach Efter det använder user jag metoderna och JsonSerializer.Serialize för att visa informationen i konsolen. Som user nämnts ovan deklareras varje kolumn i tabellen som en egenskap, så det är också möjligt att hämta värdet individuellt.