integrazione di .NET AspireSQL ServerEntity Framework Core
Include:integrazione dell'hosting e Client integrazione
SQL Server è un sistema di gestione di database relazionale sviluppato da Microsoft. L'integrazione .NET AspireSQL ServerEntity Framework Core ti consente di connetterti alle istanze esistenti di SQL Server o di creare nuove istanze da .NET utilizzando l'immagine del contenitore mcr.microsoft.com/mssql/server
.
Integrazione dell'hosting
Il SQL Server che ospita l'integrazione modella il server come tipo di SqlServerServerResource e il database come tipo di SqlServerDatabaseResource. Per accedere a questi tipi e API, aggiungere il pacchetto NuGet 📦Aspire.Hosting.SqlServer nel progetto host dell'app .
dotnet add package Aspire.Hosting.SqlServer
Per altre informazioni, vedere dotnet add package o gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere la risorsa SQL Server e la risorsa di database
Nel progetto host dell'app chiamare AddSqlServer per aggiungere e restituire un generatore di risorse SQL Server. Collega una chiamata al builder di risorse restituito a AddDatabaseper aggiungere la risorsa del database SQL Server.
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddSqlServer("sql")
.WithLifetime(ContainerLifetime.Persistent);
var db = sql.AddDatabase("database");
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
Nota
L'avvio del contenitore SQL Server è lento, quindi è consigliabile usare una durata permanente per evitare riavvii non necessari. Per altre informazioni, vedere 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 mcr.microsoft.com/mssql/server
, crea una nuova istanza SQL Server nel computer locale. Per aggiungere un database viene usato un riferimento al generatore di risorse SQL Server (la variabile sql
). Il database viene denominato database
e quindi aggiunto al ExampleProject
. La risorsa SQL Server include le credenziali predefinite con un username
di sa
e un password
casuale generato usando il metodo CreateDefaultPasswordParameter.
Quando viene eseguito l'host dell'app, la password viene archiviata nell'archivio dei segreti dell'host dell'app. Viene aggiunto alla sezione Parameters
, ad esempio:
{
"Parameters:sql-password": "<THE_GENERATED_PASSWORD>"
}
Il nome del parametro è sql-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 SQL Server con parametri.
Il metodo WithReference configura una connessione nel ExampleProject
denominato database
.
Mancia
Se preferisci connetterti a un SQL Serveresistente, chiama invece AddConnectionString. Per altre informazioni, vedere Fare riferimento alle risorse esistenti.
Aggiungere la risorsa SQL Server con il 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 sql = builder.AddSqlServer("sql")
.WithDataVolume();
var db = sql.AddDatabase("database");
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati SQL Server all'esterno del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /var/opt/mssql
all'interno del contenitore SQL Server e, quando un parametro name
non è fornito, il nome viene generato in modo casuale. Per ulteriori informazioni sui volumi di dati e sui motivi per cui sono preferiti rispetto ai mount 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 la risorsa SQL Server con il bind mount dei dati
Per aggiungere un montaggio dell'associazione dati alla risorsa SQL Server, chiamare il metodo WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddSqlServer("sql")
.WithDataBindMount(source: @"C:\SqlServer\Data");
var db = sql.AddDatabase("database");
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
Importante
I bind mount 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 diretto e la modifica dei file nel sistema host, ideale 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 persistenti i dati SQL Server tra i riavvii del contenitore. Il data bind mount è montato al percorso C:\SqlServer\Data
su Windows (o su /SqlServer/Data
nel percorso Unix) sulla macchina host nel contenitore SQL Server. Per altre informazioni sui montaggi di associazione dati, vedere Docker docs: Bind mounts.
Aggiungere SQL Server risorsa con parametri
Quando si vuole specificare in modo esplicito la password usata dall'immagine del contenitore, è possibile specificare queste credenziali come parametri. Si consideri l'esempio alternativo seguente:
var builder = DistributedApplication.CreateBuilder(args);
var password = builder.AddParameter("password", secret: true);
var sql = builder.AddSqlServer("sql", password);
var db = sql.AddDatabase("database");
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
Per altre informazioni sulla fornitura di parametri, vedere Parametri esterni.
Connettersi alle risorse del database
Quando viene eseguito l'host dell'app .NET Aspire, è possibile accedere alle risorse di database dell'serverda strumenti esterni, ad esempio SQL Server Management Studio (SSMS) o Azure Data Studio. La stringa di connessione per la risorsa di database è disponibile nelle variabili di ambiente delle risorse dipendenti ed è accessibile tramite il dashboard .NET.NET Aspire: nel riquadro "Dettagli della risorsa". La variabile di ambiente è denominata ConnectionStrings__{name}
dove {name}
è il nome della risorsa di database, in questo esempio è database
. Usare la stringa di connessione per connettersi alla risorsa di database da strumenti esterni. Si supponga di avere un database denominato todos
con una singola tabella dbo.Todos
.
Per connettersi alla risorsa di database da SQL Server Management Studio, seguire questa procedura:
Aprire SSMS.
Nella finestra di dialogo Connetti a Server, selezionare la scheda Parametri di Connessione Aggiuntivi.
Incolla la stringa di connessione nel campo parametri di connessione aggiuntivi e seleziona Connetti.
Quando sei connesso, puoi visualizzare la risorsa di database nell'Esplora oggetti:
Per ulteriori informazioni, consultare SQL Server Management Studio: Collegarsi a un server.
Hosting dei controlli di integrità dell'integrazione
L'integrazione dell'hosting SQL Server aggiunge automaticamente un controllo dello stato di integrità per la risorsa SQL Server. Il controllo di integrità verifica che il SQL Server sia in funzionamento e che sia possibile stabilire una connessione.
L'integrazione dell'hosting si basa sul pacchetto NuGet 📦 AspNetCore.HealthChecks.SqlServer.
Client integrazione
Per iniziare a usare l'integrazione di .NET AspireSQL ServerEntity Framework Core, installare il 📦Aspire.Microsoft.EntityFrameworkCore.SqlServer pacchetto NuGet nel progetto client-consuming, cioè il progetto per l'applicazione che usa il SQL ServerEntity Framework Coreclient.
dotnet add package Aspire.Microsoft.EntityFrameworkCore.SqlServer
Per altre informazioni, vedere dotnet add package o Manage package dependencies in .NET applications.
Aggiungere il contesto del database SQL Server
Nel file Program.cs del progetto in cui si consuma client, chiamate il metodo di estensione AddSqlServerDbContext su qualsiasi IHostApplicationBuilder per registrare un DbContext da usare tramite il contenitore per l'inserimento delle dipendenze. Il metodo accetta un parametro del nome di connessione.
builder.AddSqlServerDbContext<ExampleDbContext>(connectionName: "database");
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 database
lo stesso nome deve essere usato quando si chiama AddSqlServerDbContext
. Per ulteriori informazioni, vedere Aggiungere la risorsa SQL Server e la risorsa del database.
Per recuperare l'oggetto ExampleDbContext
da un servizio:
public class ExampleService(ExampleDbContext context)
{
// Use context...
}
Per altre informazioni sull'iniezione delle dipendenze, vedere .NET iniezione delle dipendenze.
Aggiungi il contesto del database SQL Server con arricchimento
Per arricchire il DbContext
con servizi aggiuntivi, ad esempio tentativi automatici, controlli di integrità, registrazione e telemetria, chiamare il metodo EnrichSqlServerDbContext:
builder.EnrichSqlServerDbContext<ExampleDbContext>(
connectionName: "database",
configureSettings: settings =>
{
settings.DisableRetry = false;
settings.CommandTimeout = 30 // seconds
});
Il parametro settings
è un'istanza della classe MicrosoftEntityFrameworkCoreSqlServerSettings.
Configurazione
L'integrazione .NET AspireSQL ServerEntity Framework Core offre più approcci di configurazione e opzioni per soddisfare i requisiti e le convenzioni del progetto.
Usare la stringa di connessione
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, si specifica il nome della stringa di connessione quando si chiama builder.AddSqlServerDbContext<TContext>()
:
builder.AddSqlServerDbContext<ExampleDbContext>("sql");
La stringa di connessione viene recuperata dalla sezione di configurazione ConnectionStrings
:
{
"ConnectionStrings": {
"sql": "Data Source=myserver;Initial Catalog=master"
}
}
Il EnrichSqlServerDbContext
non userà la sezione di configurazione ConnectionStrings
perché prevede che un DbContext
venga registrato nel momento in cui viene chiamato.
Per altre informazioni, vedere ConnectionString.
Usare i provider di configurazione
L'integrazione .NET AspireSQL ServerEntity Framework Core supporta Microsoft.Extensions.Configuration. Carica il MicrosoftEntityFrameworkCoreSqlServerSettings dai file di configurazione, ad esempio appsettings.json, utilizzando la chiave Aspire:Microsoft:EntityFrameworkCore:SqlServer
. Se sono state configurate le configurazioni nella sezione Aspire:Microsoft:EntityFrameworkCore:SqlServer
, è sufficiente chiamare il metodo senza passare alcun parametro.
Di seguito è riportato un esempio di file appsettings.json che configura alcune delle opzioni disponibili:
{
"Aspire": {
"Microsoft": {
"EntityFrameworkCore": {
"SqlServer": {
"ConnectionString": "YOUR_CONNECTIONSTRING",
"DbContextPooling": true,
"DisableHealthChecks": true,
"DisableTracing": true,
"DisableMetrics": false
}
}
}
}
}
Utilizzare configurazioni inline
È inoltre possibile passare il delegato Action<MicrosoftEntityFrameworkCoreSqlServerSettings>
per configurare alcune o tutte le opzioni direttamente nel codice, ad esempio per disattivare le metriche.
builder.AddSqlServerDbContext<YourDbContext>(
"sql",
static settings =>
settings.DisableMetrics = true);
Configurare le connessioni multiple di DbContext
Se si desidera registrare più DbContext
con una configurazione diversa, è possibile usare il nome della sezione di configurazione $"Aspire.Microsoft.EntityFrameworkCore.SqlServer:{typeof(TContext).Name}"
. La configurazione json sarà simile alla seguente:
{
"Aspire": {
"Microsoft": {
"EntityFrameworkCore": {
"SqlServer": {
"ConnectionString": "YOUR_CONNECTIONSTRING",
"DbContextPooling": true,
"DisableHealthChecks": true,
"DisableTracing": true,
"DisableMetrics": false,
"AnotherDbContext": {
"ConnectionString": "AnotherDbContext_CONNECTIONSTRING",
"DisableTracing": false
}
}
}
}
}
}
Se si chiama il metodo AddSqlServerDbContext
con parametro di tipo AnotherDbContext
, verranno caricate le impostazioni dalla sezione Aspire:Microsoft:EntityFrameworkCore:SqlServer:AnotherDbContext
.
builder.AddSqlServerDbContext<AnotherDbContext>("another-sql");
Opzioni di configurazione
Ecco le opzioni configurabili con i valori predefiniti corrispondenti:
Nome | Descrizione |
---|---|
ConnectionString |
Stringa di connessione del database SQL Server a cui connettersi. |
DbContextPooling |
Valore booleano che indica se il contesto del database verrà inserito in pool o creato in modo esplicito ogni volta che viene richiesto |
MaxRetryCount |
Numero massimo di tentativi. Il valore predefinito è 6, impostarlo su 0 per disabilitare il meccanismo di ripetizione dei tentativi. |
DisableHealthChecks |
Valore booleano che indica se il controllo integrità del database è disabilitato o meno. |
DisableTracing |
Valore booleano che indica se la traccia OpenTelemetry è disabilitata o meno. |
DisableMetrics |
Valore booleano che indica se le metriche OpenTelemetry sono disabilitate o meno. |
Timeout |
Tempo in secondi di attesa dell'esecuzione del comando. |
Controlli di salute
Per impostazione predefinita, le integrazioni di .NET.NET Aspire abilitano verifiche di integrità per tutti i servizi. Per altre informazioni, vedere panoramica delle integrazioni .NET.NET Aspire.
Per impostazione predefinita, l'integrazione .NET Aspire Sql ServerEntity Framework Core gestisce le operazioni seguenti:
- Aggiunge il
DbContextHealthCheck
, che chiama il metodo CanConnectAsync di EF Core. Il nome del controllo della salute è il nome del tipoTContext
. - Si integra con l'endpoint HTTP
/health
, che specifica che tutti i controlli di integrità registrati devono essere superati affinché l'app sia considerata pronta ad accettare 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 AspireSQL ServerEntity Framework Core 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 AspireSQL ServerEntity Framework Core genererà le seguenti attività di tracciamento usando OpenTelemetry:
- "OpenTelemetry.Instrumentation.EntityFrameworkCore"
Metriche
L'integrazione .NET AspireSQL ServerEntity Framework Core genererà le metriche seguenti usando OpenTelemetry:
- Microsoft.EntityFrameworkCore:
ec_Microsoft_EntityFrameworkCore_active_db_contexts
ec_Microsoft_EntityFrameworkCore_total_queries
ec_Microsoft_EntityFrameworkCore_queries_per_second
ec_Microsoft_EntityFrameworkCore_total_save_changes
ec_Microsoft_EntityFrameworkCore_save_changes_per_second
ec_Microsoft_EntityFrameworkCore_compiled_query_cache_hit_rate
ec_Microsoft_Entity_total_execution_strategy_operation_failures
ec_Microsoft_E_execution_strategy_operation_failures_per_second
ec_Microsoft_EntityFramew_total_optimistic_concurrency_failures
ec_Microsoft_EntityF_optimistic_concurrency_failures_per_second