Compartir a través de


Proveedor de Azure Cosmos DB para EF Core

Advertencia

En la versión 9.0 se ha realizado un gran trabajo en el proveedor Azure Cosmos DB. Con el fin de mejorar el proveedor, se han tenido que realizar una serie de cambios importantes de alto impacto. Si está actualizando una aplicación existente, lea atentamente la sección de cambios importantes.

Este proveedor de base de datos permite usar Entity Framework Core con Azure Cosmos DB. Este proveedor se mantiene como parte del proyecto Entity Framework Core.

Se recomienda encarecidamente que se familiarice con la documentación sobre Azure Cosmos DB antes de leer esta sección.

Nota

Este proveedor solo funciona con Azure Cosmos DB para NoSQL.

Instalar

Instale el paquete NuGet Microsoft.EntityFrameworkCore.Cosmos.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Introducción

Sugerencia

Puede ver en GitHub un ejemplo de este artículo.

Al igual que para otros proveedores, el primer paso es llamar a UseCosmos:

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

Advertencia

El punto de conexión y la clave se codifican aquí de forma rígida por motivos de simplicidad pero, en una aplicación de producción, se deben almacenar de manera segura. Consulte Conexión y autenticación para ver distintas formas de conectarse a Azure Cosmos DB.

En este ejemplo, Order es una entidad sencilla con una referencia al tipo owned 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; }
}

La acción de guardar y consultar datos sigue el patrón 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

Llamar a EnsureCreatedAsync es necesario para crear los contenedores necesarios e insertar los datos de inicialización si están presentes en el modelo. Sin embargo, se debe llamar a EnsureCreatedAsync solo durante la implementación y no durante la operación normal, porque podría provocar problemas de rendimiento.

Azure Cosmos DB SDK no es compatible con RBAC para las operaciones del plano de administración en Azure Cosmos DB. Use Azure Management API en lugar de EnsureCreatedAsync con RBAC.

Conexión y autenticación

El proveedor de Azure Cosmos DB para EF Core tiene varias sobrecargas del método UseCosmos. Estas sobrecargas admiten las distintas formas en que se puede realizar una conexión a la base de datos y las distintas formas de asegurarse de que la conexión sea segura.

Importante

Asegúrese de comprender el acceso seguro a los datos de Azure Cosmos DB para entender las implicaciones de seguridad y los procedimientos recomendados para usar cada sobrecarga del método UseCosmos. Por lo general, RBAC con credenciales de token es el mecanismo de control de acceso recomendado.

Mecanismo de conexión Sobrecarga de UseCosmos Información adicional
Punto de conexión y clave de cuenta UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) Claves principal o secundaria
Punto de conexión y token de cuenta UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) RBAC y tokens de recursos
Cadena de conexión UseCosmos<DbContext>(connectionString, databaseName) Trabajo con claves de cuenta y cadenas de conexión

Opciones de Azure Cosmos DB

También se puede configurar el proveedor de Azure Cosmos DB con una única cadena de conexión y especificar otras opciones para personalizar la conexión:

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

El código anterior muestra algunas opciones posibles: no está previsto que se usen al mismo tiempo. Consulte la documentación de las opciones de Azure Cosmos DB para ver una descripción detallada del efecto que tiene cada opción arriba mencionada.