Prepararsi ad accedere a MySQL con Entity Framework Core (database-first)

Data di creazione della pagina :

Ambiente di conferma dell'operazione

Studio visivo
  • Studio visivo 2022
.RETE
  • .NET 8
Nucleo di Entity Framework
  • Entity Framework Core 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Quanto sopra è un ambiente di verifica, ma potrebbe funzionare in altre versioni.

Dapprima

Entity Framework Core è una libreria di mappatori O/R che consentono di accedere ai record del database tramite modelli definiti dal codice (classi) senza scrivere direttamente istruzioni SQL quando si accede al database. Ciò offre i seguenti vantaggi:

  • Non scrive direttamente le istruzioni SQL, riducendo i rischi per la sicurezza come l'iniezione SQL
  • Poiché le istruzioni SQL sono stringhe, anche se commettono un errore nella sintassi, non sono soggette a verifica della presenza di errori di compilazione, ma poiché il modello è una sintassi di programma, è possibile verificare la presenza di errori in fase di compilazione.

Entity Framework Core genera automaticamente il codice per connettersi a questi modelli e database da database esistenti, Al contrario, esiste un modo per scrivere manualmente il codice e quindi generare automaticamente un database.

Il primo è chiamato "database-first" e il secondo è chiamato "code-first". Esiste anche il "model-first" che genera codice e database da progetti, come i diagrammi ER, ma non è ampiamente utilizzato in Entity Framework Core.

Questa volta, utilizzeremo un modello "database-first" che genera codice presupponendo che esista già un database.

Configurazione di MySQL

In questo suggerimento, assicurati di aver configurato MySQL in anticipo per accedere al tuo database MySQL. Può essere configurato su un PC nell'ambiente di sviluppo o su un altro PC in rete. Se riesci a connetterti a MySQL dal tuo ambiente di sviluppo, sei a posto. In questo suggerimento, abbiamo installato MySQL in un ambiente diverso.

I passaggi di configurazione di MySQL verranno omessi in quanto ridondanti. Le pagine seguenti contengono suggerimenti relativi a MySQL per i passaggi di configurazione.

Creazione di una tabella

In questo caso, creeremo il seguente schema (database) e la tabella come esempio.

  • Nome schema : test_schema
  • Nome tabella : utente
  • Colonne della tabella : [id], [nome], [password], [età], [email], [compleanno], [is_provisional_registration], [update_datetime]

Non importa come lo scrivete, ma se è noioso, eseguite e generate il seguente SQL su MySQL:

Di seguito è riportato lo schema SQL di creazione:

CREATE DATABASE `test_schema`;

La creazione della tabella è 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='テストコメント';

Aggiungere un record a 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');

Impostare le autorizzazioni per l'account

Assicurati di aver impostato un nome host in modo che l'account che programmi possa accedere allo schema MySQL.

È inoltre necessario impostare le autorizzazioni per test_schema accedere all'account a cui si desidera connettersi.

Questa volta, eseguiremo SELECT il processo di recupero dei record. Non lo farò questa volta, ma se vuoi INSERT UPDATE inserire o aggiornare, controlla e .

Installazione di Visual Studio

Supponendo che tu l'abbia già configurato. Se vuoi conoscere la procedura di configurazione, l'abbiamo riassunta nella pagina seguente.

Creare un progetto

Entity Framework Core non dipende da un ambiente di esecuzione specifico, quindi può essere utilizzato in molti progetti. In questo caso, si userà Entity Framework Core in un semplice ambiente di applicazione console.

Nel nuovo progetto selezionare App console (a seconda di quale sia .NET Framework).

Il progetto è stato creato dall'utente. Il nome del progetto può essere qualsiasi cosa.

Ottenere il pacchetto Entity Framework Core per MySQL

Ottenere un pacchetto per usare Entity Framework Core con NuGet. Il pacchetto utilizza: Questo non è ufficiale da parte di Microsoft, ma è ampiamente utilizzato.

  • Pomelo.EntityFrameworkCore.MySql

Fare clic con il pulsante destro del mouse sulla dipendenza e scegliere Gestisci pacchetti NuGet.

Con l'opzione "Sfoglia" selezionata dalla scheda, digitare nel campo Pomelo di ricerca . Verrà visualizzato l'elenco dei pacchetti correlati.

Installare i seguenti pacchetti da questo:

  • Pomelo.EntityFrameworkCore.MySql

Seleziona ciò che desideri installare e fai clic sul pulsante Installa. Selezionare l'ultima versione stabile per la versione.

Il dialogo è fondamentalmente OK e va bene.

Credo che il pacchetto sia il seguente.

Quindi digita EntityFrameworkCore nel campo di ricerca e installa anche quanto segue.

  • Microsoft.EntityFrameworkCore.Tools

Per le versioni, Pomelo.EntityFrameworkCore.MySql trovare la corrispondenza con la versione a cui fa riferimento Microsoft.EntityFrameworkCore . Questa volta ci riferiamo alla 8.0.2, quindi Microsoft.EntityFrameworkCore.Tools rendiamola anche 8.0.2. Questo pacchetto viene utilizzato per generare codice dal database.

Alla fine, dovrebbe assomigliare a questo:

Creare un modello (codice) da una configurazione di tabella di database

Per generare automaticamente il modello e altro codice, è necessario prima compilare il progetto per assicurarsi che non vi siano errori. Se si verifica un errore, il modello avrà esito negativo. Se è già stato verificato che non sono presenti errori, non è necessario eseguire la compilazione.

Aprire la console di Gestione pacchetti da Visual Studio. In caso contrario, è possibile aprirlo dal menu Strumenti, Gestione pacchetti NuGet e Console di Gestione pacchetti.

Vedrai una finestra come quella qui sotto, quindi assicurati che il "Progetto predefinito" nell'angolo in alto a destra sia il progetto per il quale desideri creare il modello. (Devi stare attento se hai più progetti)

Inserire il seguente testo nel campo di immissione: I parametri cambieranno a seconda dell'ambiente, quindi si prega di modificarli in modo tempestivo in base alle seguenti spiegazioni.

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

Esempio di input

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Spiegazione dei parametri Esempio di parametro
Provider Se si tratta Pomelo.EntityFrameworkCore.MySql di MySQL, specificare come. Pomelo.EntityFrameworkCore.MySql
Connessione Questa è la stringa di connessione per connettersi al database. La stringa di connessione può essere utilizzata in altre app, quindi scrivi il contenuto specificato in base alla notazione della stringa di connessione. A proposito, viene usato solo temporaneamente per creare un modello, quindi non è necessario essere consapevoli della sicurezza dopo aver pubblicato l'app per questa stringa di connessione. Se hai un simbolo nella tua password, fai attenzione alla fuga. "Server=TestServer; Banca dati=test_schema; utente=utente-test; password=XXXXXXXX;"
f Forza la sovrascrittura anche se hai già un programma. Nessun <>
OutputDir Percorso della cartella in cui viene generato il codice. Percorso relativo dalla cartella del progetto Modelli\Banca dati
Contesto Nomi delle classi di contesto quando si utilizza Entity Framework TestDatabaseDbContext
UseDatabaseNames Se specificato, il nome della tabella nel database sarà il nome della classe così com'è. In caso contrario, il caso del nome della classe di entità viene regolato in base alle regole. Nessun <>
DataAnnotations Se specificato, il tipo di colonna aggiunge automaticamente l'attributo DataAnnotation a ogni proprietà. Questo è un po' utile se si desidera eseguire automaticamente il controllo dell'input in base al tipo di database. Nessun <>
Namespace Spazio dei nomi a cui appartiene la classe di entità generata. Se non specificato, lo spazio dei nomi viene determinato in base alla cartella. Spazio dei nomi di prova
ContextNamespace Spazio dei nomi a cui appartiene l'oggetto Context generato. Se non specificato, lo spazio dei nomi viene determinato in base alla cartella. Spazio dei nomi di prova
NoOnConfiguring Evitare di incorporare stringhe di connessione non elaborate nel codice. Nessun <>
NoPluralize Evitare il nome di proprietà plurale di ogni nome di tabella nel contesto. Nessun <>

Premi Invio per eseguirlo e generare automaticamente il codice: Se si tratta di un errore, verrà visualizzato il motivo, quindi si prega di rispondere in base al contenuto dell'errore.

user Il codice del modello per la tabella è simile al seguente:

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

A proposito, l'avviso viene visualizzato perché la stringa di connessione è scritta così com'è nel codice della classe di contesto generata. Se possibile, la stringa di connessione dovrebbe essere memorizzata in un luogo separato e impostata in fase di esecuzione, ma questa volta è allo scopo di controllare l'operazione, quindi la lascerò così com'è.

Ottieni un record e visualizzalo

Ora che si dispone del codice per accedere ai record nel database, proviamo a ottenere i record e visualizzarli nella console.

Program.cs e modificarlo come segue.

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

Generare la DbContext classe new generata automaticamente con . Viene dichiarato in per consentire using var l'eliminazione automatica della connessione al database.

dbContext ha generato le proprietà per accedere a ciascun modello, quindi questa volta user è possibile modificare i record nella tabella User accedendo alle proprietà. Non è necessario essere a conoscenza dell'SQL emesso perché viene generato automaticamente internamente.

ToList Qui stiamo usando user un metodo di estensione per ottenere tutti i record nella tabella.

foreach Successivamente, utilizzo user i metodi e JsonSerializer.Serialize per visualizzare le informazioni nella console. Come user accennato in precedenza, ogni colonna della tabella è dichiarata come proprietà, quindi è anche possibile recuperare il valore singolarmente.