Provider di Azure Cosmos DB per EF Core

Avviso

Un'ampia gamma di attività è stata inserita nel provider Azure Cosmos DB nella versione 9.0. Per migliorare il provider, è stato necessario apportare una serie di modifiche di rilievo ad alto impatto; se si sta aggiornando un'applicazione esistente, leggere attentamente la sezione modifiche di rilievo.

Questo provider di database consente l'uso di Entity Framework Core con Azure Cosmos DB. Il provider viene gestito nell'ambito del progetto Entity Framework Core.

Prima di leggere questa sezione, è consigliabile acquisire familiarità con la documentazione di Azure Cosmos DB.

Nota

Questo provider funziona solo con Azure Cosmos DB for NoSQL.

Installa

Installare il pacchetto NuGet Microsoft.EntityFrameworkCore.Cosmos.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Operazioni preliminari

Suggerimento

È possibile visualizzare l'esempio di questo articolo in GitHub.

Analogamente agli altri provider, il primo passaggio consiste nel chiamare UseCosmos:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseCosmos(
        "https://localhost:8081",
        "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
        databaseName: "OrdersDB");

Avviso

L'endpoint e la chiave sono hardcoded qui per semplicità, ma in un'app di produzione devono essere archiviati in modo sicuro. Consultare la sezione Connessione e autenticazione per diversi modi per connettersi ad Azure Cosmos DB.

In questo esempio Order è un'entità semplice con un riferimento al tipo di proprietà StreetAddress.

public class Order
{
    public int Id { get; set; }
    public int? TrackingNumber { get; set; }
    public string PartitionKey { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

Per il salvataggio e l'esecuzione di query sui dati si segue il modello EF normale:

using (var context = new OrderContext())
{
    await context.Database.EnsureDeletedAsync();
    await context.Database.EnsureCreatedAsync();

    context.Add(
        new Order
        {
            Id = 1, ShippingAddress = new StreetAddress { City = "London", Street = "221 B Baker St" }, PartitionKey = "1"
        });

    await context.SaveChangesAsync();
}

using (var context = new OrderContext())
{
    var order = await context.Orders.FirstAsync();
    Console.WriteLine($"First order will ship to: {order.ShippingAddress.Street}, {order.ShippingAddress.City}");
    Console.WriteLine();
}

Importante

La chiamata di EnsureCreatedAsync è necessaria per creare i contenitori richiesti e inserire i dati di inizializzazione se presenti nel modello. Tuttavia, EnsureCreatedAsync deve essere chiamato solo durante la distribuzione, e non durante il normale funzionamento, perché potrebbe causare problemi di prestazioni.

Azure Cosmos DB SDK non supporta il controllo degli accessi in base al ruolo per le operazioni del piano di gestione in Azure Cosmos DB. Usare l'API Gestione di Azure invece di EnsureCreatedAsync con RBAC.

Connessione e autenticazione

Il provider Azure Cosmos DB per EF Core include più overload del metodo UseCosmos . Questi overload supportano i diversi modi in cui è possibile stabilire una connessione al database e i diversi modi per garantire la sicurezza della connessione.

Importante

Assicurarsi di comprendere l'accesso sicuro ai dati in Azure Cosmos DB per comprendere le implicazioni per la sicurezza e le procedure consigliate per l'uso di ogni overload del metodo UseCosmos. In genere, il controllo degli accessi in base al ruolo con le credenziali del token è il meccanismo consigliato per il controllo di accesso.

Meccanismo di connessione UseCosmos Overload Ulteriori informazioni
Endpoint e chiave dell'account UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) Chiavi primarie/secondarie
Endpoint e token dell'account UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) Controllo degli accessi in base al ruolo e token di risorse
Stringa di connessione UseCosmos<DbContext>(connectionString, databaseName) Usare chiavi dell'account e stringhe di connessione

Opzioni di Azure Cosmos DB

È anche possibile configurare il provider Azure Cosmos DB con una singola stringa di connessione e specificare altre opzioni per personalizzare la connessione:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseCosmos(
        "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
        databaseName: "OptionsDB",
        options =>
        {
            options.ConnectionMode(ConnectionMode.Gateway);
            options.WebProxy(new WebProxy());
            options.LimitToEndpoint();
            options.Region(Regions.AustraliaCentral);
            options.GatewayModeMaxConnectionLimit(32);
            options.MaxRequestsPerTcpConnection(8);
            options.MaxTcpConnectionsPerEndpoint(16);
            options.IdleTcpConnectionTimeout(TimeSpan.FromMinutes(1));
            options.OpenTcpConnectionTimeout(TimeSpan.FromMinutes(1));
            options.RequestTimeout(TimeSpan.FromMinutes(1));
        });

Il codice precedente mostra alcune opzioni possibili, che non devono essere usate contemporaneamente. Per una descrizione dettagliata dell'effetto di ogni opzione indicata in precedenza, vedere la documentazione sulle opzioni per Azure Cosmos DB.