Provedor do Azure Cosmos DB no EF Core

Aviso

Um trabalho extensivo foi feito para o provedor do Azure Cosmos DB na versão 9.0. Para melhorar o provedor, uma série de alterações significativas de alto impacto tiveram que ser feitas; Se você estiver atualizando um aplicativo existente, leia a seção Alterações interruptivas com atenção.

Este provedor de banco de dados permite que o Entity Framework Core seja usado com o Azure Cosmos DB. O provedor é mantido como parte do Projeto do Entity Framework Core.

É extremamente recomendado familiarizar-se com a documentação do Azure Cosmos DB antes de ler esta seção.

Observação

Esse provedor só funciona com o Azure Cosmos DB for NoSQL.

Instalar

Instale o pacote NuGet Microsoft.EntityFrameworkCore.Cosmos.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Introdução

Dica

Veja o exemplo deste artigo no GitHub.

Assim como para outros provedores, a primeira etapa é chamar UseCosmos:

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

Aviso

Aqui, o ponto de extremidade e a chave são embutidos no código para simplificar, mas em um aplicativo de produção, eles devem ser armazenados com segurança. Consulte Conectar e autenticar para obter diferentes maneiras de se conectar ao Azure Cosmos DB.

Neste exemplo, Order é uma entidade simples com uma referência ao tipo próprio 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; }
}

O processo de salvar e consultar dados segue o padrão de EF normal:

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

Será necessário chamar EnsureCreatedAsync para criar os contêineres obrigatórios e inserir os dados de semente (se presentes no modelo). No entanto, EnsureCreatedAsync só deve ser chamado durante a implantação, não durante a operação normal, pois isso pode causar problemas de desempenho.

O SDK do Azure Cosmos DB não dá suporte ao RBAC para operações do plano de gerenciamento no Azure Cosmos DB. Use a API de Gerenciamento do Azure em vez de EnsureCreatedAsync com RBAC.

Conectando e autenticando

O provedor do Azure Cosmos DB para EF Core tem várias sobrecargas do método UseCosmos. Essas sobrecargas dão suporte às diferentes maneiras pelas quais uma conexão pode ser feita com o banco de dados e as diferentes maneiras de garantir que a conexão seja segura.

Importante

Certifique-se de entender o acesso seguro aos dados no Azure Cosmos DB para entender as implicações de segurança e as práticas recomendadas para usar cada sobrecarga do método UseCosmos. Geralmente, o RBAC com credenciais de token é o mecanismo de controle de acesso recomendado.

Mecanismo de conexão Sobrecarga do UseCosmos Mais informações
Ponto de extremidade e chave da conta UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) Chaves primária e secundária
Ponto de extremidade e token da conta UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) RBAC e tokens de recurso
Cadeia de conexão UseCosmos<DbContext>(connectionString, databaseName) Trabalhar com chaves de conta e cadeias de conexão

Opções do Azure Cosmos DB

Também é possível configurar o provedor Azure Cosmos DB com uma única cadeia de conexão e especificar outras opções para personalizar a conexão:

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));
        });

O código acima mostra algumas opções possíveis - elas não devem ser usadas ao mesmo tempo. Confira a documentação de Opções do Azure Cosmos DB para obter uma descrição detalhada do efeito de cada opção mencionada acima.