Integrazione .NET Aspire Pomelo MySQLEntity Framework Core
Include:,,, l'integrazione dell'hosting e
,,Client, l'integrazione
MySQL è un sistema RDBMS (Relational Database Management System) open source che usa Structured Query Language (SQL) per gestire e modificare i dati. Viene impiegato in molti ambienti diversi, da progetti di piccole dimensioni a sistemi aziendali su larga scala ed è una scelta comune per ospitare i dati che supportano i microservizi in un'applicazione nativa del cloud. L'integrazione .NET Aspire Pomelo MySQLEntity Framework Core permette di connettersi ai database MySQL esistenti o creare nuove istanze da .NET con l'immagine del contenitore mysql
.
Integrazione del servizio di hosting
L'integrazione di hosting MySQL modella il server come tipo MySqlServerResource e il database come tipo MySqlDatabaseResource. Per accedere a questi tipi e API, aggiungere il pacchetto NuGet 📦Aspire.Hosting.MySql nel progetto host dell'app.
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Aspire.Hosting.MySql
Per altre informazioni, vedere dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere MySQL risorsa server e risorsa di database
Nel progetto host dell'app, invocare AddMySql per aggiungere e restituire un generatore di risorse MySQL. Esegui una chiamata concatenata al generatore di risorse restituito fino a AddDatabaseper aggiungere una risorsa di database MySQL.
var builder = DistributedApplication.CreateBuilder(args);
var mysql = builder.AddMySql("mysql")
.WithLifetime(ContainerLifetime.Persistent);
var mysqldb = mysql.AddDatabase("mysqldb");
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(mysqldb)
.WaitFor(mysqldb);
// After adding all resources, run the app...
Nota
L'avvio del contenitore SQL Server è lento, quindi è consigliabile usare un ciclo di vita persistente per evitare inutili riavvii. Per ulteriori informazioni, vedere la durata delle risorse del contenitore .
Quando .NET.NET Aspire aggiunge un'immagine del contenitore all'host dell'app, come illustrato nell'esempio precedente con l'immagine mysql
, crea una nuova istanza MySQL nel computer locale. Per aggiungere un database viene usato un riferimento al generatore di risorse MySQL (la variabile mysql
). Il database viene denominato mysqldb
e quindi aggiunto al ExampleProject
. La risorsa MySQL include le credenziali predefinite con un username
di root
e un password
casuale generato usando il metodo CreateDefaultPasswordParameter.
Quando viene eseguito l'host dell'app, la password viene archiviata nell'archivio protetto dell'host dell'app. Viene aggiunto alla sezione Parameters
, ad esempio:
{
"Parameters:mysql-password": "<THE_GENERATED_PASSWORD>"
}
Il nome del parametro è mysql-password
, ma in realtà è sufficiente formattare il nome della risorsa con un suffisso -password
. Per altre informazioni, vedere Archiviazione sicura dei segreti dell'app in fase di sviluppo in ASP.NET Core e Aggiungere una risorsa MySQL con parametri.
Il metodo WithReference configura una connessione nel ExampleProject
denominato mysqldb
.
Suggerimento
Se preferisci connetterti a un server MySQL esistente, chiama AddConnectionString. Per altre informazioni, vedere Fare riferimento alle risorse esistenti.
Aggiungere una risorsa MySQL con un volume di dati
Per aggiungere un volume di dati alla risorsa SQL Server, chiamare il metodo WithDataVolume nella risorsa SQL Server:
var builder = DistributedApplication.CreateBuilder(args);
var mysql = builder.AddMySql("mysql")
.WithDataVolume();
var mysqldb = mysql.AddDatabase("mysqldb");
builder.AddProject<Projects.ExampleProject>()
.WithReference(mysqldb)
.WaitFor(mysqldb);
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati del server MySQL al di fuori del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /var/lib/mysql
del contenitore SQL Server e, quando non viene specificato un parametro name
, il nome viene generato a caso. Per ulteriori informazioni sui volumi di dati e sui motivi per cui sono preferiti rispetto ai montaggi bind , consulta la documentazione Docker: Volumi.
Avvertimento
La password viene archiviata nel volume di dati. Quando si usa un volume di dati e se la password viene modificata, non funzionerà fino a quando non si elimina il volume.
Aggiungere una risorsa MySQL con un bind mount dei dati
Per aggiungere un punto di montaggio per l'associazione dati alla risorsa MySQL, chiamare il metodo WithDataBindMount.
var builder = DistributedApplication.CreateBuilder(args);
var mysql = builder.AddMySql("mysql")
.WithDataBindMount(source: @"C:\MySql\Data");
var db = sql.AddDatabase("mysqldb");
builder.AddProject<Projects.ExampleProject>()
.WithReference(mysqldb)
.WaitFor(mysqldb);
// After adding all resources, run the app...
Importante
I montaggi di bind dei dati hanno funzionalità limitate rispetto ai volumi , che offrono prestazioni, portabilità e sicurezza migliori, rendendoli più adatti per gli ambienti di produzione. Tuttavia, i bind mount consentono l'accesso e la modifica diretti dei file sul sistema host, rendendoli ideali per lo sviluppo e il test in cui sono necessarie modifiche in tempo reale.
I montaggi di associazione dati si basano sul file system del computer host per rendere i dati MySQL persistenti tra i riavvii dei container. Il data bind mount è montato al percorso C:\MySql\Data
su Windows (o su /MySql/Data
nel percorso Unix) sulla macchina host nel contenitore MySQL. Per ulteriori informazioni sui bind mount dei dati, consultare la documentazione Docker: Bind mounts.
Aggiungere MySQL risorsa con parametri
Quando vuoi specificare esplicitamente una password root MySQL, puoi passarla come parametro. Si consideri l'esempio alternativo seguente:
var password = builder.AddParameter("password", secret: true);
var mysql = builder.AddMySql("mysql", password)
.WithLifetime(ContainerLifetime.Persistent);
var mysqldb = mysql.AddDatabase("mysqldb");
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(mysqldb)
.WaitFor(mysqldb);
Per altre informazioni, vedere Parametri esterni.
Aggiungere una risorsa PhpMyAdmin
phpMyAdmin è uno strumento di amministrazione diffuso basato sul Web per MySQL. È possibile usarlo per esplorare e modificare MySQL oggetti quali database, tabelle, viste e indici. Per usare phpMyAdmin all'interno della soluzione .NET.NET Aspire, chiamare il metodo WithPhpMyAdmin. Questo metodo aggiunge una nuova risorsa contenitore alla soluzione che ospita phpMyAdmin e la connette al contenitore MySQL:
var builder = DistributedApplication.CreateBuilder(args);
var mysql = builder.AddMySql("mysql")
.WithPhpMyAdmin();
var db = sql.AddDatabase("mysqldb");
builder.AddProject<Projects.ExampleProject>()
.WithReference(mysqldb)
.WaitFor(mysqldb);
// After adding all resources, run the app...
Quando si esegue la soluzione, il pannello di controllo .NET.NET Aspire visualizza le risorse phpMyAdmin con un endpoint. Selezionare il collegamento all'endpoint per visualizzare phpMyAdmin in una nuova scheda del browser.
Verifica dell'integrità delle integrazioni di hosting
L'integrazione dell'hosting MySQL aggiunge automaticamente un controllo dello stato di integrità per la risorsa MySQL. Il controllo di integrità verifica che il server MySQL sia in esecuzione e che sia possibile stabilire una connessione.
L'integrazione dell'hosting si basa sul pacchetto NuGet 📦 AspNetCore.HealthChecks.MySql.
Client integrazione
Per iniziare a usare l'integrazione di .NET Aspire Pomelo MySQL Entity Framework, installare il 📦Aspire. Pomelo.EntityFrameworkCore.MySql pacchetto NuGet nel progetto che utilizza il client, ovvero il progetto per l'applicazione che usa il client MySQLEntity Framework Core.
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Aspire.Pomelo.EntityFrameworkCore.MySql
Per altre informazioni, vedere dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere un contesto di database MySQL
Nel file Program.cs del progetto che utilizza il client chiamare il metodo di estensione AddMySqlDbContext su qualsiasi IHostApplicationBuilder per registrare un DbContext da usare tramite il contenitore di inserimento delle dipendenze. Il metodo accetta un parametro del nome di connessione.
builder.AddMySqlDbContext<ExampleDbContext>(connectionName: "mysqldb");
Suggerimento
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa di database SQL Server nel progetto host dell'app. In altre parole, quando si chiama AddDatabase
e si specifica un nome di mysqldb
lo stesso nome deve essere usato quando si chiama AddMySqlDbContext
. Per altre informazioni, vedere Aggiungere MySQL risorsa server e risorsa del database.
Per recuperare un oggetto ExampleDbContext
da un servizio:
public class ExampleService(ExampleDbContext context)
{
// Use context...
}
Per ulteriori informazioni sull'iniezione di dipendenze, vedere .NET iniezione di dipendenze.
Arricchire un contesto di database MySQL
È consigliabile usare il metodo Entity Framework standard per ottenere un contesto di database e aggiungerlo al contenitore di inserimento delle dipendenze:
builder.Services.AddDbContext<ExampleDbContext>(options =>
options.UseMySql(builder.Configuration.GetConnectionString("mysqldb")
?? throw new InvalidOperationException("Connection string 'mysqldb' not found.")));
Nota
Il nome della stringa di connessione passato al metodo GetConnectionString deve corrispondere al nome usato quando si aggiunge la risorsa MySQL nel progetto host dell'app. Per altre informazioni, vedere Aggiungere MySQL risorsa server e risorsa del database.
È possibile avere maggiore flessibilità quando si crea il contesto del database in questo modo, ad esempio:
- È possibile riutilizzare il codice di configurazione esistente per il contesto del database senza riscriverlo per .NET.NET Aspire.
- È possibile usare gli intercettori Entity Framework Core per modificare le operazioni del database.
- È possibile scegliere di non usare l'aggregazione del contesto Entity Framework Core, che può avere prestazioni migliori in alcune circostanze.
Se utilizzi questo metodo, puoi migliorare il contesto del database con tentativi in stile .NET.NET Aspire, controlli di integrità, logging e funzionalità di telemetria chiamando il metodo EnrichMySqlDbContext:
builder.EnrichMySqlDbContext<ExampleDbContext>(
configureSettings: settings =>
{
settings.DisableRetry = false;
settings.CommandTimeout = 30 // seconds
});
Il parametro settings
è un'istanza della classe PomeloEntityFrameworkCoreMySqlSettings.
Configurazione
L'integrazione .NET Aspire Pomelo MySQLEntity Framework Core offre più opzioni per configurare la connessione al database in base ai requisiti e alle convenzioni del tuo progetto.
Usare una stringa di connessione
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, è possibile specificare il nome della stringa di connessione quando si chiama builder.AddMySqlDatabaseDbContext<TContext>()
:
builder.AddMySqlDatabaseDbContext<MyDbContext>("mysql");
La stringa di connessione verrà quindi recuperata dalla sezione di configurazione ConnectionStrings
:
{
"ConnectionStrings": {
"mysql": "Server=mysql;Database=mysqldb"
}
}
Il EnrichMySqlDbContext
non userà la sezione di configurazione ConnectionStrings
perché prevede che un DbContext
venga registrato nel momento in cui viene chiamato.
Per altre informazioni, vedere la documentazione MySqlConnector: ConnectionString.
Usare i provider di configurazione
L'integrazione .NET Aspire Pomelo MySQLEntity Framework Core supporta Microsoft.Extensions.Configuration. Carica il PomeloEntityFrameworkCoreMySqlSettings dai file di configurazione, ad esempio appsettings.json, utilizzando la chiave Aspire:Pomelo:EntityFrameworkCore:MySql
.
L'esempio seguente illustra un appsettings.json che configura alcune delle opzioni disponibili:
{
"Aspire": {
"Pomelo": {
"EntityFrameworkCore": {
"MySql": {
"ConnectionString": "YOUR_CONNECTIONSTRING",
"DisableHealthChecks": true,
"DisableTracing": true
}
}
}
}
}
Per lo schema completo dell'integrazione MySQLJSON, vedere Aspire. Pomelo.EntityFrameworkCore.MySql/ConfigurationSchema.json.
Usare delegati inline
È anche possibile passare il delegato Action<PomeloEntityFrameworkCoreMySqlSettings>
per configurare alcune o tutte le opzioni inline, ad esempio per disabilitare i controlli di integrità dal codice:
builder.AddMySqlDbContext<MyDbContext>(
"mysqldb",
static settings => settings.DisableHealthChecks = true);
o
builder.EnrichMySqlDbContext<MyDbContext>(
static settings => settings.DisableHealthChecks = true);
Client verifiche di integrità dell'integrazione
Per impostazione predefinita, le integrazioni client .NET.NET Aspire hanno i controlli di integrità abilitati per tutti i servizi. Analogamente, molte integrazioni di hosting .NET.NET Aspire abilitano anche gli endpoint di controllo dell'integrità. Per altre informazioni, vedere:
- controlli di integrità dell'app .NET in C#
- controlli di integrità in ASP.NET Core
Integrazione .NET Aspire Pomelo MySQLEntity Framework Core:
- Aggiunge il controllo dell'integrità quando PomeloEntityFrameworkCoreMySqlSettings.DisableHealthChecks è
false
, che chiama il metodo EF Core di CanConnectAsync. - Si integra con l'endpoint HTTP
/health
, il quale specifica che tutti i controlli di integrità registrati devono essere superati con successo affinché l'app sia considerata pronta per accettare il traffico.
Osservabilità e telemetria
.NET
.NET Aspire le integrazioni configurano automaticamente configurazioni di registrazione, traccia e metriche, talvolta note come i pilastri dell'osservabilità. Per altre informazioni sull'osservabilità e la telemetria dell'integrazione, vedere panoramica delle integrazioni .NET.NET Aspire. A seconda del servizio di backup, alcune integrazioni possono supportare solo alcune di queste funzionalità. Ad esempio, alcune integrazioni supportano la registrazione e la traccia, ma non le metriche. Le funzionalità di telemetria possono essere disabilitate anche usando le tecniche presentate nella sezione Configurazione
Registrazione
L'integrazione .NET AspireMySQLEntity Framework Core Pomelo usa le categorie di log seguenti:
Microsoft.EntityFrameworkCore.ChangeTracking
Microsoft.EntityFrameworkCore.Database.Command
Microsoft.EntityFrameworkCore.Database.Connection
Microsoft.EntityFrameworkCore.Database.Transaction
Microsoft.EntityFrameworkCore.Infrastructure
Microsoft.EntityFrameworkCore.Migrations
Microsoft.EntityFrameworkCore.Model
Microsoft.EntityFrameworkCore.Model.Validation
Microsoft.EntityFrameworkCore.Query
Microsoft.EntityFrameworkCore.Update
Tracciamento
L'integrazione .NET Aspire Pomelo MySQLEntity Framework Core genererà le attività di traccia seguenti usando OpenTelemetry:
MySqlConnector
Metriche
L'integrazione .NET AspireMySQL pomelo Entity Framework Core supporta attualmente le metriche seguenti:
- MySqlConnector:
db.client.connections.create_time
db.client.connections.use_time
db.client.connections.wait_time
db.client.connections.idle.max
db.client.connections.idle.min
db.client.connections.max
db.client.connections.pending_requests
db.client.connections.timeouts
db.client.connections.usage