次の方法で共有


.NET AspireCosmos DBEntity Framework Core 統合

含まれているもの:ホスティング統合が含まれています ホスティング統合 —および— Client 統合が含まれていますClient 統合

Azure Cosmos DB は、最新のアプリ開発のためのフル マネージドの NoSQL データベース サービスです。 .NET AspireCosmos DBEntity Framework Core 統合を使用すると、既存の Cosmos DB インスタンスに接続したり、.NET エミュレーターを使用して Azure Cosmos DB から新しいインスタンスを作成したりできます。

ホスティング統合

.NET.NET AspireAzure Cosmos DB ホスティング統合は、さまざまな Cosmos DB リソースを次の種類としてモデル化します。

これらの型と API にアクセスして表現するには、📦Aspireを追加します。Hosting.Azure。アプリ ホスト プロジェクトの CosmosDB NuGet パッケージ。

dotnet add package Aspire.Hosting.Azure.CosmosDB

詳細については、「dotnet でのパッケージの追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。

リソース AzureAzure Cosmos DB 追加する

アプリ ホスト プロジェクトで、AddAzureCosmosDB を呼び出して、AzureAzure Cosmos DB リソース ビルダーを追加して返します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db");

// After adding all resources, run the app...

アプリ ホストに AzureCosmosDBResource を追加すると、データベースとコンテナーを追加するための他の便利な API が公開されます。 つまり、他の AzureCosmosDBResource リソースを追加する前に、Cosmos DB を追加する必要があります。

重要

AddAzureCosmosDBを呼び出すと、暗黙的に AddAzureProvisioningが呼び出されます。これによって、アプリの起動時に Azure リソースを動的に生成するためのサポートが追加されます。 アプリは、適切なサブスクリプションと場所を構成する必要があります。 詳細については、「 ローカル プロビジョニング: 構成」を参照してください。

プロビジョニングによって生成されたBicep

Bicep を初めて使用する場合は、Azureリソースを定義するためのドメイン固有の言語です。 .NET.NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 AzureAzure Cosmos DB リソースを追加すると、次の Bicep が生成されます。

@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location

resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2024-08-15' = {
  name: take('cosmos-${uniqueString(resourceGroup().id)}', 44)
  ___location: ___location
  properties: {
    locations: [
      {
        locationName: ___location
        failoverPriority: 0
      }
    ]
    consistencyPolicy: {
      defaultConsistencyLevel: 'Session'
    }
    databaseAccountOfferType: 'Standard'
    disableLocalAuth: true
  }
  kind: 'GlobalDocumentDB'
  tags: {
    'aspire-resource-name': 'cosmos'
  }
}

output connectionString string = cosmos.properties.documentEndpoint

output name string = cosmos.name

上記の Bicep は、 AzureAzure Cosmos DB アカウント リソースをプロビジョニングするモジュールです。 さらに、ロールの割り当ては、別のモジュールで Azure リソースに対して作成されます。

@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location

param cosmos_outputs_name string

param principalId string

resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2024-08-15' existing = {
  name: cosmos_outputs_name
}

resource cosmos_roleDefinition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2024-08-15' existing = {
  name: '00000000-0000-0000-0000-000000000002'
  parent: cosmos
}

resource cosmos_roleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-08-15' = {
  name: guid(principalId, cosmos_roleDefinition.id, cosmos.id)
  properties: {
    principalId: principalId
    roleDefinitionId: cosmos_roleDefinition.id
    scope: cosmos.id
  }
  parent: cosmos
}

生成された Bicep は開始点であり、C# のプロビジョニング インフラストラクチャへの変更の影響を受ける。 Bicep ファイルのカスタマイズは直接上書きされるため、C# プロビジョニング API を通じて変更を加えて、生成されたファイルに反映されるようにします。

プロビジョニング インフラストラクチャをカスタマイズする

すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 この型により、Azure リソースを構成するための fluent API を提供し、ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) API を使用して生成された Bicep をカスタマイズできます。 たとえば、kindconsistencyPolicylocationsなどを構成できます。 次の例では、AzureAzure Cosmos DB リソースをカスタマイズする方法を示します。

builder.AddAzureCosmosDB("cosmos-db")
    .ConfigureInfrastructure(infra =>
    {
        var cosmosDbAccount = infra.GetProvisionableResources()
                                   .OfType<CosmosDBAccount>()
                                   .Single();

        cosmosDbAccount.Kind = CosmosDBAccountKind.MongoDB;
        cosmosDbAccount.ConsistencyPolicy = new()
        {
            DefaultConsistencyLevel = DefaultConsistencyLevel.Strong,
        };
        cosmosDbAccount.Tags.Add("ExampleKey", "Example value");
    });

上記のコード:

AzureAzure Cosmos DB リソースをカスタマイズするには、さらに多くの構成オプションを使用できます。 詳細については、Azure.Provisioning.CosmosDBを参照してください。 詳細については、Azureを参照してください

既存の AzureAzure Cosmos DB アカウントに接続する

接続する既存の AzureAzure Cosmos DB アカウントがある場合があります。 呼び出しをチェーンして、AzureCosmosDBResource が既存のリソースであることを注釈付けることができます。

var builder = DistributedApplication.CreateBuilder(args);

var existingCosmosName = builder.AddParameter("existingCosmosName");
var existingCosmosResourceGroup = builder.AddParameter("existingCosmosResourceGroup");

var cosmos = builder.AddAzureCosmosDB("cosmos-db")
                    .AsExisting(existingCosmosName, existingCosmosResourceGroup);

builder.AddProject<Projects.WebApplication>("web")
       .WithReference(cosmos);

// After adding all resources, run the app...

AzureAzure Cosmos DB リソースを既存のリソースとして扱う方法の詳細については、「既存の Azure リソースを使用する」を参照してください。

手記

または、AzureAzure Cosmos DB リソースを表す代わりに、接続文字列をアプリ ホストに追加することもできます。 このアプローチは弱く型指定されており、ロールの割り当てやインフラストラクチャのカスタマイズでは機能しません。 詳細については、「Azureを使用して既存の リソースを追加する」を参照してください。

データベースリソースとコンテナー リソース AzureAzure Cosmos DB 追加する

.NET Aspire は、 Azure Cosmos DB リソース間の親子関係をモデル化します。 たとえば、 AzureAzure Cosmos DB アカウント (AzureCosmosDBResource) は複数のデータベース (AzureCosmosDBDatabaseResource) を持つ場合があり、各データベースには複数のコンテナー (AzureCosmosDBContainerResource) を含めることができます。 データベースまたはコンテナー リソースを追加する場合は、親リソースに対して追加します。

AzureAzure Cosmos DB データベース リソースを追加するには、AddCosmosDatabase インスタンスで IResourceBuilder<AzureCosmosDBResource> メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db");
var db = cosmos.AddCosmosDatabase("db");

// After adding all resources, run the app...

AddCosmosDatabaseを呼び出すと、db という名前のデータベースが Cosmos DB リソースに追加され、新しく作成されたデータベース リソースが返されます。 データベースは、先ほど追加した Cosmos DB によって表される AzureCosmosDBResource アカウントに作成されます。 データベースは、コレクションとユーザーの論理コンテナーです。

AzureAzure Cosmos DB コンテナーは、データが格納される場所です。 コンテナーを作成するときに、パーティション キーを指定する必要があります。

AzureAzure Cosmos DB コンテナー リソースを追加するには、AddContainer インスタンスで IResourceBuilder<AzureCosmosDBDatabaseResource> メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db");
var db = cosmos.AddCosmosDatabase("db");
var container = db.AddContainer("entries", "/id");

// After adding all resources, run the app...

コンテナーは、先ほど追加した AzureCosmosDBDatabaseResource によって表されるデータベースに作成されます。 詳細については、の「データベース、コンテナー、項目」を参照してください。

親の子リソースリレーションシップの例

Azure Cosmos DB リソース間の親子関係をより深く理解するには、次の例を検討してください。この例では、データベースとコンテナーと共にAzure Cosmos DB リソースを追加する方法を示します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos");

var customers = cosmos.AddCosmosDatabase("customers");
var profiles = customers.AddContainer("profiles", "/id");

var orders = cosmos.AddCosmosDatabase("orders");
var details = orders.AddContainer("details", "/id");
var history = orders.AddContainer("history", "/id");

builder.AddProject<Projects.Api>("api")
       .WithReference(profiles)
       .WithReference(details)
       .WithReference(history);

builder.Build().Run();

上記のコードは、AzureとAzure Cosmos DBの 2 つのデータベースを持つ cosmos という名前のcustomersorders リソースを追加します。 customers データベースには profiles という名前のコンテナーが 1 つありますが、orders データベースには detailshistory の 2 つのコンテナーがあります。 各コンテナーのパーティション キーは /id

次の図は、 AzureAzure Cosmos DB リソース間の親子関係を示しています。

リソースの親子リレーションシップ AzureAzure Cosmos DB 示す図。

アプリ ホスト コードが親子関係を表す場合、クライアントは名前によってこれらのリソースにディープ リンクできます。 たとえば、customers データベースは、クライアント プロジェクト内の名前で参照でき、Database データベースに接続するcustomers インスタンスを登録します。 名前付きコンテナーにも同じことが当てはまります。たとえば、details コンテナーはクライアント プロジェクト内の名前で参照でき、Container コンテナーに接続するdetails インスタンスを登録します。

エミュレーター リソース AzureAzure Cosmos DB 追加する

AzureAzure Cosmos DB エミュレーター リソースを追加するには、IResourceBuilder<AzureCosmosDBResource> の呼び出しを RunAsEmulator API にチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db")
                    .RunAsEmulator();

// After adding all resources, run the app...

RunAsEmulatorを呼び出すと、エミュレーターを使用してローカルで実行するように Cosmos DB リソースが構成されます。 この場合のエミュレーターは、AzureAzure Cosmos DB エミュレーターです。 Azure Cosmos DB Emulator は、Azure Cosmos DB アプリをテストするための無料のローカル環境を提供し、.NET AspireAzure ホスティング統合に最適です。 エミュレーターはインストールされていません。代わりに、コンテナーとして .NET.NET Aspire にアクセスできます。 前の例に示すように、mcr.microsoft.com/cosmosdb/emulator イメージでコンテナーをアプリ ホストに追加すると、アプリ ホストが起動したときにコンテナーが作成されて起動されます。 詳細については、「 コンテナー リソースのライフサイクル」を参照してください。

Cosmos DB エミュレータコンテナを設定する

コンテナー リソースで使用できるさまざまな構成があります。たとえば、コンテナーのポート、環境変数、 有効期間などを構成できます。

エミュレーター コンテナー ゲートウェイ ポート Cosmos DB 構成する

既定では、Cosmos DBによって構成された .NET Aspire エミュレーター コンテナーは、次のエンドポイントを公開します。

エンドポイント コンテナー ポート ホスト ポート
https 8081 動的

リッスンしているポートは、既定では動的です。 コンテナーが起動すると、ポートはホスト コンピューター上のランダムなポートにマップされます。 エンドポイント ポートを構成するには、次の例に示すように、RunAsEmulator メソッドによって提供されるコンテナー リソース ビルダーの呼び出しをチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithGatewayPort(7777);
                     });

// After adding all resources, run the app...

上記のコードは、ポート Cosmos DBでリッスンするように、https エミュレーター コンテナーの既存の 8081 エンドポイントを構成します。 Cosmos DB エミュレーター コンテナーのポートは、次の表に示すようにホスト ポートにマップされます。

エンドポイント名 ポート マッピング (container:host)
https 8081:7777
永続性を持つCosmos DBエミュレーターコンテナーを構成する

永続的な有効期間で Cosmos DB エミュレーター コンテナーを構成するには、WithLifetime エミュレーター コンテナー リソースで Cosmos DB メソッドを呼び出し、ContainerLifetime.Persistent渡します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithLifetime(ContainerLifetime.Persistent);
                     });

// After adding all resources, run the app...

詳細については、「コンテナー リソースの有効期間 」を参照してください。

Cosmos DBエミュレーターコンテナーをデータボリュームと共に構成する

AzureAzure Cosmos DB エミュレーター リソースにデータ ボリュームを追加するには、WithDataVolumeAzure エミュレーター リソースで Azure Cosmos DB メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithDataVolume();
                     });

// After adding all resources, run the app...

データ ボリュームは、コンテナーのライフサイクル外に Cosmos DB エミュレーター データを保持するために使用されます。 データ ボリュームは、/tmp/cosmos/appdata エミュレーター コンテナーの Cosmos DB パスにマウントされ、name パラメーターが指定されていない場合は、名前が生成されます。 エミュレーターには、AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE 環境変数が trueに設定されています。 データ ボリュームの詳細と、バインド マウントよりも優先される理由の詳細については、「 Docker ドキュメント: ボリューム」を参照してください。

エミュレーター コンテナー Cosmos DB のパーティション数を構成する

Cosmos DB エミュレーター コンテナーのパーティション数を構成するには、WithPartitionCount メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithPartitionCount(100); // Defaults to 25
                     });

// After adding all resources, run the app...

上記のコードでは、Cosmos DBのパーティション数を持つ 100 エミュレーター コンテナーを構成します。 これは、AZURE_COSMOS_EMULATOR_PARTITION_COUNT 環境変数を設定するための短縮形です。

Linuxベースのエミュレーターを使用する (プレビュー)

AzureAzure Cosmos DB エミュレーターの次世代は完全にLinuxベースであり、Docker コンテナーとして使用できます。 さまざまなプロセッサとオペレーティング システムでの実行をサポートしています。

Cosmos DB エミュレーターのプレビュー バージョンを使用するには、RunAsPreviewEmulator メソッドを呼び出します。 この機能はプレビュー段階であるため、ASPIRECOSMOSDB001 試験的な診断を抑制して、プレビュー機能を明示的にオプトインする必要があります。

プレビュー エミュレーターでは、Web UI を使用して Cosmos DB エミュレーターに格納されているデータを表示できる "データ エクスプローラー" エンドポイントの公開もサポートしています。 データ エクスプローラーを有効にするには、WithDataExplorer メソッドを呼び出します。

#pragma warning disable ASPIRECOSMOSDB001

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsPreviewEmulator(
                     emulator =>
                     {
                         emulator.WithDataExplorer();
                     });

// After adding all resources, run the app...

上記のコードでは、実行時に使用する Linuxベースのプレビュー Cosmos DB エミュレーター コンテナーと Data Explorer エンドポイントを構成します。

ホスティング統合の正常性チェック

Azure Cosmos DB ホスティング統合により、Cosmos DB リソースの正常性チェックが自動的に追加されます。 正常性チェックでは、Cosmos DB が実行されていることと、その Cosmos DB への接続を確立できることを確認します。

ホスティング統合は、📦 AspNetCore.HealthChecks.CosmosDb NuGet パッケージに依存します。

Client 統合

Microsoft 統合を始めるには、クライアントが使用するプロジェクト、つまり Microsoft クライアントを利用するアプリケーションのプロジェクトに、.Microsoft.EntityFrameworkCore.Cosmos NuGet パッケージをインストールします。

dotnet add package Aspire.Microsoft.EntityFrameworkCore.Cosmos

コンテキスト Cosmos DB を追加する

クライアントを使用するプロジェクトの Program.cs ファイルで、AddCosmosDbContext 拡張メソッドを呼び出して、依存関係挿入コンテナーを介して使用する System.Data.Entity.DbContext を登録します。 このメソッドは、接続名パラメーターとデータベース名パラメーターを受け取ります。

builder.AddCosmosDbContext<MyDbContext>("cosmosdb", "databaseName");

または、接続文字列に 1 つのデータベースがある場合に、接続からデータベース名を推論することもできます。 この場合は、データベース名パラメーターを省略できます。

builder.AddCosmosDbContext<MyDbContext>("cosmosdb");

アドバイス

connectionName パラメーターは、アプリ ホスト プロジェクトに Cosmos DB リソースを追加するときに使用する名前と一致する必要があります。 つまり、AddAzureCosmosDB を呼び出す際に cosmosdb の名前を指定し、その同じ名前を AddCosmosDbContextを呼び出す際にも使用する必要があります。 詳細については、「AzureAzure Cosmos DB 追加する」を参照してください。

その後、依存関係の挿入を使用して DbContext インスタンスを取得できます。 たとえば、サービスからクライアントを取得するには、次のようにします。

public class ExampleService(MyDbContext context)
{
    // Use context...
}

を使用する方法の詳細については、noSQL SDK for の例を参照してください。

構成

.NET Aspire Microsoft Entity Framework CoreCosmos DB 統合には、プロジェクトの要件と規則に基づいて Azure Cosmos DB 接続を構成するための複数のオプションが用意されています。

接続文字列を使用する

ConnectionStrings 構成セクションの接続文字列を使用する場合は、builder.AddCosmosDbContextを呼び出すときに接続文字列の名前を指定できます。

builder.AddCosmosDbContext<MyDbContext>("CosmosConnection");

接続文字列は、ConnectionStrings 構成セクションから取得されます。

{
  "ConnectionStrings": {
    "CosmosConnection": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};"
  }
}

詳細については、 ConnectionString のドキュメントを参照してください

構成プロバイダーを使用する

.NET Aspire Microsoft Entity Framework CoreCosmos DB 統合では、Microsoft.Extensions.Configurationがサポートされています。 EntityFrameworkCoreCosmosSettingsなどの構成ファイルから appsettings.json を読み込みます。 一部のオプションを構成する _appsettings.json の例:

{
  "Aspire": {
    "Microsoft": {
      "EntityFrameworkCore": {
        "Cosmos": {
          "DisableTracing": true
        }
      }
    }
  }
}

完全なCosmos DBクライアント統合JSONスキーマについては、Aspireを参照してください。Microsoft.EntityFrameworkCore.Cosmos/ConfigurationSchema.json.

インライン デリゲートを使用する

Action<EntityFrameworkCoreCosmosSettings> configureSettings デリゲートを渡して、コードからのトレースを無効にするなどの EntityFrameworkCoreCosmosSettings オプションの一部またはすべてをインラインで設定することもできます。

builder.AddCosmosDbContext<MyDbContext>(
    "cosmosdb",
    settings => settings.DisableTracing = true);

Client 統合ヘルスチェック

Microsoft の .NET AspireEntity Framework CoreCosmos DB 統合は現在、正常性チェックを実装していませんが、将来のリリースでは変更される可能性があります。

可観測性とテレメトリ

統合により、ログ記録、トレース、メトリックの構成が自動的に設定されます。これは、監視の柱 とも呼ばれます。 統合の可観測性とテレメトリの詳細については、統合の概要 参照してください。 バッキング サービスによっては、一部の統合でこれらの機能の一部のみがサポートされる場合があります。 たとえば、一部の統合ではログ記録とトレースがサポートされますが、メトリックはサポートされません。 テレメトリ機能は、「 構成」 セクションに示されている手法を使用して無効にすることもできます。

伐採

Microsoft .NET Aspire 統合では、Entity Framework CoreCosmos DB の次のログカテゴリが使用されます。

  • Azure-Cosmos-Operation-Request-Diagnostics
  • Microsoft.EntityFrameworkCore.ChangeTracking
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Infrastructure
  • Microsoft.EntityFrameworkCore.Query

トレーシング

.NET Aspire Microsoft Entity Framework CoreCosmos DB 統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。

  • Azure.Cosmos.Operation
  • OpenTelemetry.Instrumentation.EntityFrameworkCore

メトリック

.NET Aspire Microsoft Entity Framework CoreCosmos DB 統合では、現在、次のメトリックがサポートされています。

  • Microsoft.EntityFrameworkCore
    • ec_Microsoft_EntityFrameworkCore_active_db_contexts
    • ec_Microsoft_EntityFrameworkCore_total_queries
    • ec_Microsoft_EntityFrameworkCore_queries_per_second
    • ec_Microsoft_EntityFrameworkCore_total_save_changes
    • ec_Microsoft_EntityFrameworkCore_save_changes_per_second
    • ec_Microsoft_EntityFrameworkCore_compiled_query_cache_hit_rate
    • ec_Microsoft_Entity_total_execution_strategy_operation_failures
    • ec_Microsoft_E_execution_strategy_operation_failures_per_second
    • ec_Microsoft_EntityFramew_total_optimistic_concurrency_failures
    • ec_Microsoft_EntityF_optimistic_concurrency_failures_per_second

関連情報をご覧ください