次の方法で共有


.NET Aspire Oracle Entity Framework Core 統合

含まれるもの: ホスティング統合 と 統合Client

Oracle データベース は、Oracleが所有および開発した広く使用されているリレーショナルデータベース管理システムです。 .NET Aspire Oracle Entity Framework Core 統合により、既存の Oracle サーバーに接続したり、.NET コンテナー イメージを使用して から新しいサーバーを作成したりできます。

ホスティング統合

.NET Aspire Oracle ホスティング統合は、サーバーを OracleDatabaseServerResource の種類として、データベースを OracleDatabaseResource の種類としてモデル化します。 これらの型と API にアクセスするには、📦Aspire.Hosting. の NuGet パッケージOracleアプリ ホスト プロジェクトに追加します。

dotnet add package Aspire.Hosting.Oracle

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

Oracleのサーバーリソースとデータベースリソースを追加する

アプリ ホスト プロジェクトで、AddOracle を呼び出して、Oracle サーバー リソース ビルダーを追加して返します。 返されたリソース ビルダーに対して呼び出しをチェーンし、AddDatabaseを実行して、Oracle データベースをサーバー リソースに追加します。

var builder = DistributedApplication.CreateBuilder(args);

var oracle = builder.AddOracle("oracle")
                    .WithLifetime(ContainerLifetime.Persistent);

var oracledb = oracle.AddDatabase("oracledb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(oracledb);
       .WaitFor(oracledb);

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

手記

Oracle データベース コンテナーの起動に時間がかかる可能性があるため、不要な再起動を避けるために、永続的な の有効期間を使用することをお勧めします。 詳細については、「コンテナー リソースの有効期間 」を参照してください。

.NET .NET Aspire 前の例に示すように、container-registry.oracle.com/database/free イメージを使用してコンテナー イメージをアプリ ホストに追加すると、ローカル コンピューターに新しい Oracle サーバーが作成されます。 データベースの追加には、Oracle リソース ビルダー (oracle 変数) への参照が使用されます。 データベースには oracledb という名前が付けられ、ExampleProjectに追加されます。 Oracle リソースには、password メソッドを使用して生成されたランダムな CreateDefaultPasswordParameter が含まれています。

WithReference メソッドは、ExampleProjectという名前の "oracledb" で接続を構成します。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。

ヒント

既存の Oracle サーバーに接続する場合は、代わりに AddConnectionString を呼び出します。 詳細については、「既存のリソースを参照する」を参照してください。

パスワード パラメーター Oracle リソースを追加する

Oracle リソースには、ランダムなパスワードを持つ既定の資格情報が含まれています。 Oracle では、環境変数 ORACLE_PWDを使用して、構成ベースの既定のパスワードをサポートしています。 パスワードを明示的に指定する場合は、パラメーターとして指定できます。

var password = builder.AddParameter("password", secret: true);

var oracle = builder.AddOracle("oracle", password)
                    .WithLifetime(ContainerLifetime.Persistent);

var oracledb = oracle.AddDatabase("oracledb");

var myService = builder.AddProject<Projects.ExampleProject>()
                       .WithReference(oracledb)
                       .WaitFor(oracledb);

上記のコードは、AddOracle API に渡すパラメーターを取得し、ORACLE_PWD コンテナーの Oracle 環境変数に内部的にパラメーターを割り当てます。 password パラメーターは、通常、ユーザー シークレットとして指定されます。

{
  "Parameters": {
    "password": "Non-default-P@ssw0rd"
  }
}

詳細については、「外部パラメーターを参照してください。

データ ボリューム Oracle リソースを追加する

Oracle リソースにデータ ボリュームを追加するには、WithDataVolume メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var oracle = builder.AddOracle("oracle")
                    .WithDataVolume()
                    .WithLifetime(ContainerLifetime.Persistent);

var oracledb = oracle.AddDatabase("oracle");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(oracledb)
       .WaitFor(oracledb);

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

データ ボリュームは、Oracle データをコンテナーのライフサイクル外に保持するために使用されます。 データ ボリュームは、/opt/oracle/oradata コンテナー内の Oracle パスにマウントされ、name パラメーターが指定されていない場合、名前はランダムに生成されます。 データボリュームと、バインドマウントよりもそれらが優先される理由の詳細については、「Docker ドキュメント: ボリューム」を参照してください。

警告

パスワードはデータ ボリュームに格納されます。 データ ボリュームを使用していて、パスワードが変更された場合は、ボリュームを削除するまで機能しません。

データバインドマウントを用いてOracleリソースを追加する

Oracle リソースにデータ バインド マウントを追加するには、WithDataBindMount メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var oracle = builder.AddOracle("oracle")
                    .WithDataBindMount(source: @"C:\Oracle\Data");

var oracledb = oracle.AddDatabase("oracledb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(oracledb)
       .WaitFor(oracledb);

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

大事な

データ バインド マウント、パフォーマンス、移植性、およびセキュリティが向上し、運用環境に適した ボリュームと比較して機能が制限されています。 ただし、バインド マウントを使用すると、ホスト システム上のファイルに直接アクセスして変更できるため、リアルタイムの変更が必要な開発とテストに最適です。

データ バインド マウントは、ホスト マシンのファイルシステムに依存して、コンテナーの再起動間に Oracle データを保持します。 データ バインド マウントは、C:\Oracle\Data コンテナー内のホスト コンピューター上の Windows 上の /Oracle/Data (または Unixの Oracle) パスにマウントされます。 データ バインド マウントの詳細については、「Docker ドキュメント: バインド マウント」を参照してください。

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

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

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

Client 統合

データベースにアクセスするには、Oracle データベースと接続文字列が必要です。 .NET Aspire Oracle クライアント統合を開始するには、📦Aspireをインストールします。Oracle.EntityFrameworkCore クライアントを使用するプロジェクト、つまり、Oracle クライアントを使用するアプリケーションのプロジェクトの NuGet パッケージです。 Oracle クライアント統合では、DbContextとの対話に使用できる Oracle インスタンスが登録されます。

dotnet add package Aspire.Oracle.EntityFrameworkCore

クライアント Oracle 追加する

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

builder.AddOracleDatabaseDbContext<ExampleDbContext>(connectionName: "oracledb");

ヒント

connectionName パラメーターは、Oracle データベース リソースをアプリ ホスト プロジェクトに追加するときに使用する名前と一致する必要があります。 つまり、AddDatabase を呼び出す際に指定された oracledb の名前は、AddOracleDatabaseDbContextを呼び出す時にも使用されるべきです。 詳細については、「Oracle サーバーおよびデータベース リソース追加する」を参照してください。

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

public class ExampleService(ExampleDbContext context)
{
    // Use database context...
}

依存関係の挿入の詳細については、.NET 依存関係の挿入を参照してください。

Oracleデータベースのコンテキストを充実させる

標準の Entity Framework メソッドを使用してデータベース コンテキストを取得し、依存関係挿入コンテナーに追加することもできます。

builder.Services.AddDbContext<ExampleDbContext>(options =>
    options.UseOracle(builder.Configuration.GetConnectionString("oracledb")
        ?? throw new InvalidOperationException("Connection string 'oracledb' not found.")));

手記

GetConnectionString メソッドに渡す接続文字列名は、アプリ ホスト プロジェクトに Oracle リソースを追加するときに使用する名前と一致する必要があります。 詳細については、「Oracle サーバーおよびデータベース リソース追加する」を参照してください。

次に例を示すように、この方法でデータベース コンテキストを作成する際の柔軟性が向上します。

  • データベース コンテキストの既存の構成コードは、.NET.NET Aspire用に書き換えることなく再利用できます。
  • Entity Framework Core インターセプターを使用して、データベース操作を変更できます。
  • コンテキスト プール Entity Framework Core 使用しないことを選択できます。状況によってはパフォーマンスが向上する可能性があります。

このメソッドを使用する場合は、.NET メソッドを呼び出すことで、.NET AspireEnrichOracleDatabaseDbContextスタイルの再試行、正常性チェック、ログ記録、テレメトリ機能を使用してデータベース コンテキストを拡張できます。

builder.EnrichOracleDatabaseDbContext<ExampleDbContext>(
    configureSettings: settings =>
    {
        settings.DisableRetry = false;
        settings.CommandTimeout = 30 // seconds
    });

settings パラメーターは、OracleEntityFrameworkCoreSettings クラスのインスタンスです。

構成

.NET Aspire Oracle Entity Framework Core 統合では、プロジェクトの要件と規則を満たす複数の構成アプローチとオプションが提供されます。

接続文字列を使用する

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

builder.AddOracleDatabaseDbContext<ExampleDbContext>("oracleConnection");

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

{
  "ConnectionStrings": {
    "oracleConnection": "Data Source=TORCL;User Id=OracleUser;Password=Non-default-P@ssw0rd;"
  }
}

EnrichOracleDatabaseDbContext では、呼び出された時点で ConnectionStrings が登録されることを想定しているため、DbContext 構成セクションは使用されません。

詳細については、ODP.NET ドキュメントを参照してください。

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

.NET Aspire Oracle Entity Framework Core 統合では、Microsoft.Extensions.Configuration キーを使用した appsettings.json などの構成ファイルからの Aspire:Oracle:EntityFrameworkCore がサポートされます。 Aspire:Oracle:EntityFrameworkCore セクションで構成を設定した場合は、パラメーターを渡さずにメソッドを呼び出すことができます。

使用可能なオプションの一部を構成する appsettings.json の例を次に示します。

{
  "Aspire": {
    "Oracle": {
      "EntityFrameworkCore": {
        "DisableHealthChecks": true,
        "DisableTracing": true,
        "DisableRetry": false,
        "CommandTimeout": 30
      }
    }
  }
}

ヒント

CommandTimeout プロパティは秒単位です。 前の例に示すように設定すると、タイムアウトは 30 秒です。

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

Action<OracleEntityFrameworkCoreSettings> デリゲートを渡して、コードから正常性チェックを無効にするなど、一部またはすべてのオプションをインラインで設定することもできます。

builder.AddOracleDatabaseDbContext<ExampleDbContext>(
    "oracle",
    static settings => settings.DisableHealthChecks  = true);

又は

builder.EnrichOracleDatabaseDbContext<ExampleDbContext>(
    static settings => settings.DisableHealthChecks  = true);

構成オプション

対応する既定値を使用して構成可能なオプションを次に示します。

名前 説明
ConnectionString 接続する Oracle データベースの接続文字列。
DisableHealthChecks データベースの正常性チェックが無効かどうかを示すブール値。
DisableTracing OpenTelemetry トレースが無効かどうかを示すブール値。
DisableRetry コマンドの再試行を無効にするかどうかを示すブール値。
CommandTimeout コマンドの実行を待機する秒数。

Client 統合ヘルスチェック

既定では、.NET.NET Aspireクライアント統合 すべてのサービスで 正常性チェック 有効になっています。 同様に、多くの .NET.NET Aspireホスティング統合 もヘルスチェックエンドポイントを有効にします。 詳細については、以下を参照してください。

既定では、.NET AspireOracleEntity Framework Core 統合によって次の処理が行われます。

可観測性とテレメトリ

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

伐採

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

  • Microsoft.EntityFrameworkCore.ChangeTracking
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Database.Connection
  • Microsoft.EntityFrameworkCore.Database.Transaction
  • Microsoft.EntityFrameworkCore.Infrastructure
  • Microsoft.EntityFrameworkCore.Migrations
  • Microsoft.EntityFrameworkCore.Model
  • Microsoft.EntityFrameworkCore.Model.Validation
  • Microsoft.EntityFrameworkCore.Query
  • Microsoft.EntityFrameworkCore.Update

トレーシング

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

  • OpenTelemetry.Instrumentation.EntityFrameworkCore

メトリック

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

  • Microsoft.EntityFrameworkCore

関連項目