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(DbContextOptionsBuilder, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
UseOracle(string connectionString)
この拡張メソッドは、プロバイダおよびデータベース接続構成を設定します。開発者は、ODP.NET Coreで使用可能なすべての接続文字列属性を設定できます。
宣言
// C# optionsBuilder.UseOracle(@"User Id=blog;Password=<password>;Data Source=pdborcl;");
UseOracle(DbContextOptionsBuilder, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
次の拡張機能は、最初にDbConnection
や接続文字列を設定せずにOracleデータベースに接続するようにEFコア・コンテキストを構成します。DbConnection
または接続文字列は、DbContext
がデータベースへの接続を試行する前に設定する必要があります。接続を設定するには、RelationalDatabaseFacadeExtensions.SetDbConnection
またはRelationalDatabaseFacadeExtensions.SetConnectionString
を使用します。
宣言
// C# public static DbContextOptionsBuilder UseOracle(this DbContextOptionsBuilder, Action<OracleDbContextOptionsBuilder>)
パラメータ
-
DbContextOptionsBuilder
- コンテキストの構成に使用されるビルダー -
Action<OracleDbContextOptionsBuilder>
- Oracle固有の追加構成を許可するオプションの処理
戻り値
オプション・ビルダーを使用して、さらに構成を連鎖できます。
サンプル・コード
// C# - Setting up the DB context protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseOracle(); // Using the DB context using (var context = new DbContext()) { context.Database.SetDbConnection(new OracleConnection(<connection string>)); }
ノート:
-
optionsBuilder
はDbContextOptionsBuilder
型です。 -
Oracle組込みアカウントを使用してEntity Frameworkの移行を保存しないでください。
UseOracleSQLCompatibility(string version)
この拡張メソッドは、生成されたSQLおよび機能と互換性のあるデータベース・バージョンを指定します。
ノート:
このメソッドは非推奨です。Oracle EF Core 8では、メソッドUseOracleSQLCompatibility(enum version)
を使用してOracle Databaseの互換性バージョンを設定します。
ODP.NET 21cは、引き続きEF Core 6および7にUseOracleSQLCompatibility(string version)
を使用します。
このメソッドでは、値"12"
がデフォルトとして使用されます。生成されたSQLは、データベース・バージョン12以降と互換性があります。他の値はメソッドの動作を変更しません。
// C# optionsBuilder.UseOracle("User Id=hr;Password=<password>;Data Source = inst1", b => b.UseOracleSQLCompatibility("12"));
ノート:
optionsBuilder
はDbContextOptionsBuilder
型です。
UseOracleSQLCompatibility(enum version)
OracleSQLCompatibilityの列挙は、生成されたSQLと互換性があるデータベース・バージョンを指定するために使用されます。また、.NETタイプのタイプ・マッピングを決定するためにも使用されます。
Oracle EF Core 23cを使用するEF Core 8以上のバージョンでは、UseOracleSQLCompatibility
拡張メソッドでは、文字列値ではなく列挙型を引数として取るようになりました。
現在、UseOracleSQLCompatibility()
APIを使用してアプリケーションに設定できるSQLCompatibilityには3つの値があります。
使用できる有効な列挙値を次に示します。
-
OracleSQLCompatibility.DatabaseVersion19
-
OracleSQLCompatibility.DatabaseVersion21
-
OracleSQLCompatibility.DatabaseVersion23
Oracle EF Core 8をOracleSQLCompatibility.DatabaseVersion21
とともに使用する場合、JSONデータベース列がサポートされます。それ以外の場合、集計タイプはJSONではなくデータベースのNCLOB列にマップされます。
OracleSQLCompatibility.DatabaseVersion23
を使用すると、.NETブール型はデフォルトでNUMBER(1)
ではなくOracle BOOLEAN
列型にマップされます。.NETブールをデフォルトでNUMBER(1)
にマップするには、OracleSQLCompatibility.DatabaseVersion21
以降を使用します。
デフォルトの列挙値は、ODP.NETバージョンと一致します。ODP.NET 23cの場合、デフォルトはOracleSQLCompatibility.DatabaseVersion23
です。
次の例に、UseOracleSQLCompatibility
を設定する方法を示します。
// C# optionsBuilder.UseOracle("User Id=hr;Password=<password>;Data Source = inst1", b => b.UseOracleSQLCompatibility(OracleSQLCompatibility.DatabaseVersion19));
ノート:
optionsBuilder
はDbContextOptionsBuilder
型です。
IQueryingEnumerableインタフェース
この項の内容は次のとおりです。
IQueryingEnumerable.ToQueryString拡張メソッド
使用されるOracle SQL問合せの文字列表現。この拡張メソッドにより、Oracle DatabaseおよびOracle Autonomous Databaseで実行可能なSQLが生成されます。
生成されたSQLをプログラムで実行するために、開発者は特定の要件に対して次のC#疑似コードを適合させることができます。疑似コードは、サンプルLINQ問合せでToQueryString()
を使用してスクリプトを生成する方法と、OracleCommand
を使用してスクリプトを実行する方法を示しています。これはアプリケーションをバックアップするデータベース・バージョンによって異なります。
using System.Data; using Microsoft.EntityFrameworkCore; using Oracle.ManagedDataAccess.Client; class ToQueryStringPseudoCode { static void Main(string[] args) { using (ModelContext db = new ModelContext()) { //sample LINQ to convert query string from string name = "Name"; var query = db.Set<Instructor>().Where(c => c.Name == name); string sqltext = query.ToQueryString(); //’sqltext’ can be used directly with OracleCommand OracleConnection con = new OracleConnection("<Connection String>"); con.Open(); OracleCommand cmd = con.CreateCommand(); cmd.CommandText = sqltext; OracleDataReader reader; reader = cmd.ExecuteReader(); //verifying the result set while (reader.Read()) { Console.WriteLine($"{reader[0]}, {reader[1]}, {reader[2]}, {reader[3]}"); } con.Close(); } } }
MigrationBuilderクラス
MigrationBuilder.IsOracle拡張メソッド
MigrationBuilderオブジェクトがデータベース・プロバイダとしてODP.NETを使用する場合、trueを返します。
宣言
public static bool IsOracle(this MigrationBuilder)
パラメータ
MigrationBuilder
オブジェクト
戻り値
bool。
サンプル・コード
var migrationBuilder = new MigrationBuilder("Oracle.EntityFrameworkCore"); bool b_oracle = migrationBuilder.IsOracle(); //returns true for ODP.NET
ModelBuilderクラス
ODP.NET EF Coreには、追加の拡張メソッド、およびModelBuilder
クラスのメソッドのデフォルト動作に対する変更が含まれています。
ModelBuilder UseIdentityColumn()およびUseOracleIdentityColumn()
この拡張メソッドは、UseOracleSQLCompatibility()
に渡される値に応じて、列がID列か、またはサーバー生成列値を保持するために順序とトリガーに関連付けられているかを指定します。デフォルトでは、この拡張メソッドは列で有効ではありません。
// C # protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>().Property(p => p.Id).UseIdentityColumn(); }
EF Core 3.1以降のバージョンの場合は、UseIdentityColumn
を使用します。EF Core 3.1 Core以前のバージョンの場合は、UseOracleIdentityColumn
を使用できます。EF Core 5以降、UseOracleIdentityColumn
はOracle EF Coreでは使用できません。これら2つのメソッドには同じ機能があります。この項の残りの部分では、UseIdentityColumn
という用語はUseOracleIdentityColumn
と同義です。