integración de .NET Aspire Pomelo MySQLEntity Framework Core
Incluye:integración de hospedaje y
integraciónClient
MySQL es un sistema de administración de bases de datos relacionales (RDBMS) de código abierto que usa lenguaje de consulta estructurado (SQL) para administrar y manipular datos. Se emplea en muchos entornos diferentes, desde proyectos pequeños hasta sistemas empresariales a gran escala y es una opción popular hospedar datos que respaldan microservicios en una aplicación nativa de nube. La integración de .NET Aspire Pomelo MySQLEntity Framework Core permite conectarse a bases de datos de MySQL existentes o crear nuevas instancias desde .NET con la imagen de contenedor de mysql
.
Integración de hospedaje
La integración de alojamiento MySQL modela los modelos de integración del servidor como el tipo MySqlServerResource y la base de datos como el tipo MySqlDatabaseResource. Para acceder a estos tipos y API, agregue el paquete NuGet 📦Aspire.Hosting.MySql en el proyecto de la aplicación host .
-
de la CLI de
- PackageReference
dotnet add package Aspire.Hosting.MySql
Para obtener más información, consulte dotnet add package o Administrar las dependencias del paquete en .NET aplicaciones.
Agregar MySQL recurso de servidor y recurso de base de datos
En el proyecto host de la aplicación, llame a AddMySql para agregar y devolver un generador de recursos de tipo MySQL. Enlaza una llamada al generador de recursos devuelto a AddDatabasepara agregar un recurso de base de datos 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
El contenedor de SQL Server es lento de iniciarse, por lo que es mejor usar una duración de persistente para evitar reinicios innecesarios. Para obtener más información, consulte ciclo de vida de los recursos del contenedor.
Cuando .NET.NET Aspire agrega una imagen de contenedor al host de la aplicación, como se muestra en el ejemplo anterior con la imagen de mysql
, crea una nueva instancia de MySQL en el equipo local. Se usa una referencia al generador de recursos de MySQL (la variable mysql
) para agregar una base de datos. La base de datos se denomina mysqldb
y, a continuación, se agrega al ExampleProject
. El recurso MySQL incluye credenciales predeterminadas con un username
de root
y un password
aleatorio generado mediante el método CreateDefaultPasswordParameter.
Cuando se ejecuta el host de la aplicación, la contraseña se almacena en el almacén de secretos del host de la aplicación. Queda añadido a la sección Parameters
, por ejemplo:
{
"Parameters:mysql-password": "<THE_GENERATED_PASSWORD>"
}
El nombre del parámetro es mysql-password
, pero realmente solo da formato al nombre del recurso con un sufijo -password
. Para obtener más información, consulte almacenamiento seguro de secretos de aplicación en desarrollo en ASP.NET Core y Agregar MySQL recurso con parámetros.
El método WithReference configura una conexión en el ExampleProject
denominado mysqldb
.
Consejo (if the meaning of "Tip" is advice or suggestion)
Si prefiere conectarse a un servidor MySQL existente, llame a AddConnectionString en su lugar. Para obtener más información, vea Consulte los recursos existentes.
Agregar un recurso MySQL con un volumen de datos
Para agregar un volumen de datos al recurso de SQL Server, llame al método WithDataVolume en el recurso 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...
El volumen de datos se usa para conservar los datos del servidor de MySQL fuera del ciclo de vida de su contenedor. El volumen de datos se monta en la ruta /var/lib/mysql
dentro del contenedor SQL Server y, si no se proporciona un parámetro name
, el nombre se genera de manera aleatoria. Para obtener más información sobre los volúmenes de datos y detalles sobre por qué se prefieren a los montajes de enlace , consulte la documentación Docker: Volúmenes.
Advertencia
La contraseña se almacena en el volumen de datos. Cuando se utiliza un volumen de datos y cambia la contraseña, no funcionará hasta que se elimine el volumen.
Agrega un recurso MySQL con una vinculación de datos
Para agregar una montura de enlace de datos al recurso de MySQL, llame al método 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
Los montajes de enlace de datos tienen una funcionalidad limitada en comparación con los volúmenes , que ofrecen mejor rendimiento, portabilidad y seguridad, por lo que son más apropiados para entornos de producción. Sin embargo, los bind mounts permiten el acceso directo y la modificación de archivos en el sistema host, lo que es ideal para el desarrollo y las pruebas donde se necesitan cambios en tiempo real.
Los montajes de enlace de datos dependen del sistema de archivos del equipo host para preservar los datos de MySQL cada vez que se reinicia el contenedor. El punto de montaje de enlace de datos se monta en la ruta C:\MySql\Data
en Windows (o /MySql/Data
en Unix) en el equipo host dentro del contenedor MySQL. Para obtener más información sobre los montajes de enlace de datos, consulte la documentación Docker: Montajes de enlace.
Añadir recurso MySQL con parámetros
Cuando desee proporcionar explícitamente una contraseña de raíz MySQL, puede pasarla como parámetro. Considere el siguiente ejemplo alternativo:
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);
Para obtener más información, vea Parámetros externos.
Adición de un recurso PhpMyAdmin
phpMyAdmin es una popular herramienta de administración basada en web para MySQL. Puede usarlo para examinar y modificar MySQL objetos como bases de datos, tablas, vistas e índices. Para usar phpMyAdmin en la solución de .NET.NET Aspire, llame al método WithPhpMyAdmin. Este método agrega un nuevo recurso de contenedor a la solución que hospeda phpMyAdmin y lo conecta al contenedor de 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...
Al ejecutar la solución, el tablero .NET.NET Aspire muestra los recursos phpMyAdmin con un punto de conexión. Seleccione el vínculo al punto de conexión para ver phpMyAdmin en una nueva pestaña del explorador.
Comprobaciones de estado de la integración de hospedaje
La integración de hospedaje MySQL agrega automáticamente una comprobación de estado para el recurso MySQL. La comprobación de estado comprueba que el MySQL servidor se está ejecutando y que se puede establecer una conexión a él.
La integración de hospedaje se basa en el paquete NuGet de 📦 AspNetCore.HealthChecks.MySql.
integración de Client
Para empezar a trabajar con la integración de .NET Aspire Pomelo MySQL Entity Framework, instale el paquete NuGet 📦Aspire.Pomelo.EntityFrameworkCore.MySql en el proyecto que consume el cliente, es decir, el proyecto de la aplicación que usa el cliente MySQLEntity Framework Core.
-
de la CLI de
- PackageReference
dotnet add package Aspire.Pomelo.EntityFrameworkCore.MySql
Para obtener más información, consulte dotnet add package o Administrar las dependencias del paquete en .NET aplicaciones.
Añadir un contexto de base de datos de MySQL
En el archivo Program.cs del proyecto que consume el cliente, llame al método de extensión AddMySqlDbContext en cualquier IHostApplicationBuilder para registrar un DbContext para su uso mediante el contenedor de inserción de dependencias. El método toma un parámetro de nombre de conexión.
builder.AddMySqlDbContext<ExampleDbContext>(connectionName: "mysqldb");
Consejo (if the meaning of "Tip" is advice or suggestion)
El parámetro connectionName
debe coincidir con el nombre usado al agregar el recurso de base de datos SQL Server en el proyecto host de la aplicación. Es decir, cuando se llama a AddDatabase
y se proporciona un nombre de mysqldb
ese mismo nombre se debe usar al llamar a AddMySqlDbContext
. Para obtener más información, consulte Añadir MySQL recurso de servidor y recurso de base de datos.
Para recuperar el objeto ExampleDbContext
de un servicio:
public class ExampleService(ExampleDbContext context)
{
// Use context...
}
Para obtener más información sobre la inyección de dependencias, consulte .NET inyección de dependencias.
Enriquecer un contexto de base de datos de MySQL
Es posible que prefiera usar el método de Entity Framework estándar para obtener un contexto de base de datos y agregarlo al contenedor de inserción de dependencias:
builder.Services.AddDbContext<ExampleDbContext>(options =>
options.UseMySql(builder.Configuration.GetConnectionString("mysqldb")
?? throw new InvalidOperationException("Connection string 'mysqldb' not found.")));
Nota
El nombre de la cadena de conexión que se pasa al método GetConnectionString debe coincidir con el nombre usado al agregar el recurso de MySQL en el proyecto host de la aplicación. Para obtener más información, consulte Añadir MySQL recurso de servidor y recurso de base de datos.
Tiene más flexibilidad al crear el contexto de la base de datos de esta manera, por ejemplo:
- Puede reutilizar el código de configuración existente para el contexto de la base de datos sin volver a escribirlo para .NET.NET Aspire.
- Puede usar Entity Framework Core interceptores para modificar las operaciones de base de datos.
- Puede optar por no usar la agrupación de contextos Entity Framework Core, lo cual podría funcionar mejor en algunas circunstancias.
Si usa este método, puede mejorar el contexto de la base de datos con reintentos de estilo .NET.NET Aspire, comprobaciones de estado, registro y características de telemetría llamando al método EnrichMySqlDbContext:
builder.EnrichMySqlDbContext<ExampleDbContext>(
configureSettings: settings =>
{
settings.DisableRetry = false;
settings.CommandTimeout = 30 // seconds
});
El parámetro settings
es una instancia de la clase PomeloEntityFrameworkCoreMySqlSettings.
Configuración
La integración de .NET Aspire Pomelo MySQLEntity Framework Core proporciona varias opciones para configurar la conexión de base de datos en función de los requisitos y convenciones del proyecto.
Uso de una cadena de conexión
Al usar una cadena de conexión de la sección de configuración de ConnectionStrings
, puede proporcionar el nombre de la cadena de conexión al llamar a builder.AddMySqlDatabaseDbContext<TContext>()
:
builder.AddMySqlDatabaseDbContext<MyDbContext>("mysql");
Luego, la cadena de conexión se recuperará de la sección de configuración ConnectionStrings
.
{
"ConnectionStrings": {
"mysql": "Server=mysql;Database=mysqldb"
}
}
El EnrichMySqlDbContext
no usará la sección de configuración de ConnectionStrings
, ya que espera que se registre un DbContext
en el momento en que se le llama.
Para obtener más información, consulte la documentación de MySqlConnector: ConnectionString.
Uso de proveedores de configuración
La integración de .NET Aspire Pomelo MySQLEntity Framework Core admite Microsoft.Extensions.Configuration. Carga el PomeloEntityFrameworkCoreMySqlSettings desde archivos de configuración como appsettings.json mediante la clave Aspire:Pomelo:EntityFrameworkCore:MySql
.
En el ejemplo siguiente se muestra un appsettings.json que configura algunas de las opciones disponibles:
{
"Aspire": {
"Pomelo": {
"EntityFrameworkCore": {
"MySql": {
"ConnectionString": "YOUR_CONNECTIONSTRING",
"DisableHealthChecks": true,
"DisableTracing": true
}
}
}
}
}
Para obtener el esquema completo MySQL de integración JSON, consulte Aspire.Pomelo.EntityFrameworkCore.MySql/ConfigurationSchema.json.
Usa delegados insertados
También puede pasar el delegado Action<PomeloEntityFrameworkCoreMySqlSettings>
para configurar algunas o todas las opciones en línea, por ejemplo, para deshabilitar las comprobaciones de salud desde el código:
builder.AddMySqlDbContext<MyDbContext>(
"mysqldb",
static settings => settings.DisableHealthChecks = true);
o
builder.EnrichMySqlDbContext<MyDbContext>(
static settings => settings.DisableHealthChecks = true);
Client comprobaciones de salud de integración
De forma predeterminada, las integraciones de cliente .NET.NET Aspire tienen las comprobaciones de estado habilitadas para todos los servicios. Del mismo modo, muchas .NET.NET Aspireintegraciones de hospedaje también habilitan los puntos de conexión de comprobación de estado. Para obtener más información, consulte:
- .NET comprobaciones de estado de la aplicación en C#
- comprobaciones de estado de en ASP.NET Core
La integración de .NET Aspire Pomelo MySQLEntity Framework Core:
- Agrega la comprobación de salud si PomeloEntityFrameworkCoreMySqlSettings.DisableHealthChecks es
false
, que invoca el método EF Core de CanConnectAsync. - Se integra con el endpoint HTTP de
/health
, el cual especifica que todas las comprobaciones de estado registradas deben superarse para que la aplicación se considere lista para aceptar tráfico.
Observabilidad y telemetría
.NET .NET Aspire integraciones configuran automáticamente las configuraciones de registro, seguimiento y métricas, que a veces se conocen como los pilares de la observabilidad. Para obtener más información sobre la observabilidad de integración y la telemetría, consulte información general sobre las integraciones de .NET.NET Aspire. En función del servicio de respaldo, algunas integraciones solo pueden admitir algunas de estas características. Por ejemplo, algunas integraciones admiten el registro y el seguimiento, pero no las métricas. Las características de telemetría también se pueden deshabilitar mediante las técnicas presentadas en la sección Configuración.
Registro
La integración de .NET AspireMySQLEntity Framework Core Pomelo usa las siguientes categorías de registro:
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
Rastreo
La integración de .NET Aspire Pomelo MySQLEntity Framework Core emitirá las siguientes actividades de seguimiento mediante OpenTelemetry:
MySqlConnector
Métricas
La integración de .NET Aspire Pomelo MySQLEntity Framework Core admite actualmente las siguientes métricas:
- 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