Prepararsi ad accedere a MySQL con Entity Framework Core (database-first)
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.