Прочитать на английском

Поделиться через


Поставщик EF Core для Azure Cosmos DB

Предупреждение

Обширная работа прошла в поставщике Azure Cosmos DB в версии 9.0. Для улучшения поставщика необходимо вносить ряд критически важных изменений; Если вы обновляете существующее приложение, внимательно ознакомьтесь с разделом критических изменений.

Этот поставщик базы данных позволяет использовать Entity Framework Core с Azure Cosmos DB. Работы над этим поставщиком ведутся в рамках проекта Entity Framework Core.

Перед чтением этого раздела мы настоятельно рекомендуем ознакомиться с документацией по Azure Cosmos DB.

Примечание

Этот поставщик работает только с Azure Cosmos DB для NoSQL.

Установка

Установите пакет NuGet Microsoft.EntityFrameworkCore.Cosmos.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Начало работы

Совет

Вы можете скачать используемый в этой статье пример из репозитория GitHub.

Как и для других поставщиков, сначала нужно вызвать UseCosmos.

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

Предупреждение

Для простоты конечная точка и ключ здесь заданы в коде, но в рабочем приложении необходимо обеспечить их безопасное хранение. Сведения о подключении и проверке подлинности различных способов подключения к Azure Cosmos DB.

В этом примере Order представляет собой простую сущность, ссылающуюся на 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; }
}

Сохранение данных и запрос на их получение выполняется, как обычно в EF:

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

Важно!

Путем вызова EnsureCreatedAsync вы создадите требуемые контейнеры и вставите начальные данные, если они есть в модели. Но EnsureCreatedAsync следует вызывать только во время развертывания, а не в рабочем режиме, так как это может вызвать проблемы с производительностью.

Пакет SDK Azure Cosmos DB не поддерживает RBAC для операций плоскости управления в Azure Cosmos DB. Используйте API управления Azure вместо EnsureCreatedAsync с RBAC.

Подключение и проверка подлинности

Поставщик Azure Cosmos DB для EF Core имеет несколько перегрузок метода UseCosmos . Эти перегрузки поддерживают различные способы подключения к базе данных и различные способы обеспечения безопасности подключения.

Важно!

Обязательно понять безопасный доступ к данным в Azure Cosmos DB, чтобы понять последствия безопасности и рекомендации по использованию каждой перегрузки UseCosmos метода. Как правило, RBAC с учетными данными токена — это рекомендуемый механизм управления доступом.

Механизм подключения Перегрузка UseCosmos Дополнительные сведения
Конечная точка и ключ учетной записи UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) Первичные/вторичные ключи
Конечная точка и маркер учетной записи UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) RBAC и маркеры ресурсов
Connection string UseCosmos<DbContext>(connectionString, databaseName) Работа с ключами учетной записи и строка подключения

Параметры Azure Cosmos DB

Также можно настроить поставщик Azure Cosmos DB с одним строка подключения и указать другие параметры настройки подключения:

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

Приведенный выше код показывает некоторые возможные параметры. Они не предназначены для одновременного использования. Подробное описание каждого из указанных выше параметров см. в документации по параметрам Azure Cosmos DB.