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.