Application Program Interface

ODP.NET EF Coreは、標準のEF Core Application Program Interfaceをサポートしています。プロバイダには、プロバイダに固有の追加の拡張メソッドが含まれています。

DatabaseFacadeクラス

ODP.NET EF Coreには、追加の拡張メソッド、およびDatabaseFacadeクラスのメソッドのデフォルト動作に対する変更が含まれています。

DatabaseFacade.IsOracle

ODP.NETが現在使用されているデータベース・プロバイダの場合、このメソッドはtrueを戻します。

// C#
public static bool IsOracle()

ブール値を戻します。

ノート:

プロバイダは、DbContextにプロバイダが設定された後にのみ認識されます。

DatabaseFacade.EnsureCreated

このプロパティによって、現在のコンテキストに定義されたスキーマの表が存在することが保証されます。

宣言

// C#
public static bool EnsureCreated()

戻り値

bool

備考

スキーマ内にいずれかの表が存在する場合は、何も処理が実行されません。既存の表は、EF Coreコンテキスト・モデルとの互換性がチェックされません。

スキーマ内に表が存在しない場合は、すべての定義済コンテキスト・モデル・オブジェクトが作成されます。

接続文字列に指定されたユーザー/スキーマが存在しない場合は、エラーがスローされ、ユーザー/スキーマを作成する処理は実行されません。管理者は、このメソッドを使用する前に、ユーザー/スキーマを作成して、適切な権限を割り当てる必要があります。

コンテキストに定義されたすべてのオブジェクトが作成される場合、戻り値はtrueです。スキーマにいずれかの表がすでに存在する場合は、falseです。

例外

存在しないユーザー/スキーマが接続文字列で指定された場合は、NotSupportedException()がスローされます。

タイプ: NotSupportedException()

メッセージ: 必要なユーザーが存在しないか、指定されたユーザー名/パスワードが無効です

DatabaseFacade.EnsureCreated(string[])

このプロパティによって、文字列配列内の指定されたスキーマの表が存在することが保証されます。

宣言

// C#
public static bool EnsureCreated (string[] schemas)

パラメータ

  • schemas – EF Coreコンテキストの既存の表をチェックするスキーマのリスト。スキーマ名は大/小文字が区別されます。

戻り値

bool

備考

文字列配列スキーマ・リスト内にいずれかの表が存在する場合は、何も処理が実行されません。既存の表は、EF Coreコンテキスト・モデルとの互換性がチェックされません。

文字列配列スキーマ・リスト内に表が存在しない場合は、すべての定義済コンテキスト・モデル・オブジェクトが作成されます。

接続文字列に指定されたユーザー/スキーマが存在しない場合は、エラーがスローされ、ユーザー/スキーマを作成する処理は実行されません。管理者は、このメソッドを使用する前に、ユーザー/スキーマを作成して、適切な権限を割り当てる必要があります。

このメソッドに渡されたスキーマに、接続文字列に指定されたユーザー/スキーマが含まれない場合、そのスキーマは暗黙的にスキーマの配列に追加されます。

スキーマの配列がNULLまたは長さ0 (ゼロ)の場合は、DatabaseFacade.EnsureCreated() APIがコールされます。

コンテキストに定義されたすべてのオブジェクトが作成される場合、戻り値はtrueです。スキーマにいずれかの表がすでに存在する場合は、falseです。

例外

存在しないユーザー/スキーマが接続文字列で指定された場合は、NotSupportedException()がスローされます。

タイプ: NotSupportedException()

メッセージ: 必要なユーザーが存在しないか、指定されたユーザー名/パスワードが無効です

サンプル・コード

using (var db = DbContext())
{
    db.Database.EnsureCreated(new string[]{"SCOTT", "HR", "EFUser"});
}

DatabaseFacade.EnsureDeleted

このプロパティによって、スキーマ・ユーザーの作成したオブジェクトがすべて削除されることが保証されます。

宣言

// C#
public static bool EnsureDeleted()

戻り値

bool

備考

EF Coreコンテキスト・モデル・オブジェクトが存在しない場合は、何も処理が実行されません。オブジェクトが存在する場合、Oracleデータ・ディクショナリ・オブジェクトを除いて、すべてのユーザー/スキーマ・オブジェクトが削除されます。

警告: 削除されたオブジェクトには、EF Coreコンテキスト・モデル以外のスキーマ・オブジェクトが含まれます(ユーザー/スキーマにこれらのオブジェクトを削除する権限がある場合)。

現在のコンテキストで定義されたスキーマが存在しない場合は、何も処理が実行されません。

現在のコンテキストでスキーマに関連するユーザー作成オブジェクトをすべて削除しようとする場合、戻り値はtrueです。接続文字列に指定されたスキーマが存在しない場合は、falseです。

DatabaseFacade.EnsureDeleted(string[])

このプロパティによって、文字列配列内の指定されたスキーマのユーザー/スキーマ・オブジェクトが削除されることが保証されます。

宣言

// C#
public static bool EnsureCreated (string[] schemas)

パラメータ

  • schemas – ユーザー生成オブジェクトを削除するスキーマのリスト。スキーマ名は大/小文字が区別されます。

戻り値

bool

備考

オブジェクトが存在する場合、Oracleデータ・ディクショナリ・オブジェクトを除いて、すべてのユーザー/スキーマ・オブジェクトが削除されます。EF Coreコンテキスト・モデル・オブジェクトが存在しない場合は、何も処理が実行されません。このメソッドに渡されたスキーマに、接続文字列に指定されたユーザー/スキーマが含まれない場合、そのスキーマは暗黙的にスキーマの配列に追加されます。

警告: 削除されたオブジェクトには、EF Coreコンテキスト・モデル以外のスキーマ・オブジェクトが含まれます(ユーザー/スキーマにこれらのオブジェクトを削除する権限がある場合)。

指定されたスキーマが存在しない場合は、何も処理が実行されません。

指定されたスキーマ内でユーザーが権限を持つユーザー作成オブジェクトをすべて削除しようとする場合、戻り値はtrueです。接続文字列に指定されたスキーマが存在しない場合は、falseです。

サンプル・コード

using (var db = DbContext())
{
    db.Database.EnsureDeleted(new string[]{"SCOTT", "HR", "EFUser"});
}

DbContextOptionsBuilderクラス

ODP.NET EF Coreには、追加の拡張メソッド、およびDbContextOptionsBuilderクラスのメソッドのデフォルト動作に対する変更が含まれています。

DbContextOptionsBuilder.UseOracle

この拡張メソッドは、Oracle Databaseに接続するためのプロバイダおよびデータベース接続構成を設定します。開発者は、ODP.NET Coreで使用可能なすべての接続文字列属性を設定できます。コールできる使用可能なメソッドのオーバーロードは、次のとおりです。

  • UseOracle(string connectionString)
  • UseOracle(string connectionString, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
  • UseOracle(DbConnection connection, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
  • DbContextOptionsBuilder<TContext> UseOracle<TContext>(string connectionString, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
  • DbContextOptionsBuilder<TContext> UseOracle<TContext>(DbConnection connection,Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)

UseOracle(string connectionString)

この拡張メソッドは、プロバイダおよびデータベース接続構成を設定します。開発者は、ODP.NET Coreで使用可能なすべての接続文字列属性を設定できます。

// C#
optionsBuilder.UseOracle(@"User Id=blog;Password=<password>;Data Source=pdborcl;");

ノート:

  • optionsBuilderDbContextOptionsBuilder型です。

  • Oracle組込みアカウントを使用してEntity Frameworkの移行を保存しないでください。

UseOracleSQLCompatibility(string version)

この拡張メソッドは、生成されたSQLと互換性を持つデータベース・バージョンを指定します。

このメソッドは、「11」または「12」(デフォルト)のいずれかの値を受け入れます。デフォルトでは、生成されたSQLはデータベース・バージョン12以上と互換性があります。Oracle Databaseバージョン11.2を使用する顧客は、UseOracleSQLCompatibility("11")を設定する必要があります。

// C#
optionsBuilder.UseOracle("User Id=hr;Password=<password>;Data Source = inst1", b =>
b.UseOracleSQLCompatibility("11"));

ノート:

optionsBuilderDbContextOptionsBuilder型です。

UseOracleSQLCompatibilityが11に設定されている場合は、UseOracleIdentityColumn()の設定に関係なく、常に順序とトリガーが使用されます。

ModelBuilderクラス

ODP.NET EF Coreには、追加の拡張メソッド、およびModelBuilderクラスのメソッドのデフォルト動作に対する変更が含まれています。

ModelBuilder.UseOracleIdentityColumn()

この拡張メソッドは、UseOracleSQLCompatibility()に渡される値に応じて、列がID列か、またはサーバー生成列値を保持するために順序とトリガーに関連付けられているかを指定します。デフォルトでは、この拡張メソッドは列で有効ではありません。

// C #
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property(p => p.Id).UseOracleIdentityColumn();
}

ID列、順序およびトリガーの使用

Oracleデータベースでは、1つの表に1つのID列のみを設定できます。また、通常、その列は主キーとして使用されます。EF Core規則によって主キーは一意である必要があるため、その列はID列または順序/トリガー列になります。

主キー以外の列の場合、次のマトリックスに、UseOracleSQLCompatibilityUseOracleIdentityColumnの値、およびOracleデータベースのバージョンに基づく列の動作を示します。

UseOacleSQLCompatibility=11の場合:

Databaseバージョン

UseOacleSQLCompatibility=11 UseOracleIdentityColumn=Enabled

UseOracleSQLCompatibility=11 UseOracleIdentityColumn=Disabled

11.2

順序およびトリガーを使用

操作は行われません

12以上

順序およびトリガーを使用

操作は行われません

UseOracleSQLCompatibility=12の場合:

Databaseバージョン

UseOracleSQLCompatibility=12 UseOracleIdentityColumn=Enabled

UseOracleSQLCompatibility=12 UseOracleIdentityColumn=Disabled (デフォルト)

11.2

許可されない/エラー

操作は行われません

12以上

IDを使用

操作は行われません

通常、開発者は、以前のOracleデータベース・バージョンとの下位互換性を維持したり、以前のバージョンとの動作の一貫性を維持するために、UseOacleSQLCompatibilityおよびUseOracleIdentityColumnを使用します。