EF Core Azure Cosmos DB プロバイダー

警告

Cosmos DB プロバイダーの 9.0 では広範な作業を行いました。 プロバイダーを改善するには、影響の大きい破壊的変更を多数行う必要がありました。既存のアプリケーションをアップグレードする場合は、破壊的変更に関するセクションを注意深くお読みください。

このデータベース プロバイダーにより、Azure Cosmos DB と共に Entity Framework Core を使用できます。 このプロバイダーは、Entity Framework Core プロジェクトの一部として保守管理されています。

このセクションを読む前に、Azure Cosmos DB のドキュメントを理解することを強くお勧めします。

注意

このプロバイダーは、Azure Cosmos DB for NoSQL でのみ機能します。

インストール

Microsoft.EntityFrameworkCore.Cosmos NuGet パッケージをインストールします。

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 は、パフォーマンスの問題を引き起こす可能性があるため、通常の操作ではなく、配置時にのみ呼び出す必要があります。

Azure Cosmos DB SDK では、Azure Cosmos DB での管理プレーン操作に対する RBAC はサポートされていません。 RBAC で EnsureCreatedAsync の代わりに Azure Management API を使用してください。

接続と認証

EF Core 用 Azure Cosmos DB プロバイダーには、UseCosmos メソッドの複数のオーバーロードがあります。 これらのオーバーロードでは、データベースへの接続を確立するさまざまな方法と、接続が安全であることを保証するさまざまな方法がサポートされています。

重要

UseCosmos メソッドの各オーバーロードを使用する際のセキュリティの影響とベスト プラクティスを理解するには、「Azure Cosmos DB のデータへのアクセスをセキュリティで保護する」を理解してください。

接続メカニズム UseCosmos オーバーロード 詳細
アカウント エンドポイントとキー UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) 主/セカンダリ キー
アカウント エンドポイントとトークン UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) リソース トークン
接続文字列 UseCosmos<DbContext>(connectionString, databaseName) アカウント キーと接続文字列を操作する

Azure Cosmos DB のオプション

1 つの接続文字列で 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 のオプションに関するドキュメント を参照してください。