パフォーマンスに関する考慮事項

.NET Stringエンティティ・プロパティのバインド・データ型およびデータベース列のデータ型のUnicodeサポートが一致する場合、EF Coreアプリケーションのパフォーマンスは文字ベースのデータのバインドに最適です。マッピングが適切に実行されると、アプリケーションは文字列エンティティ・プロパティ値をNVARCHAR2 (NVARCHAR2列の場合)またはVARCHAR2 (VARCHAR2列の場合)として適切にバインドします。タイプが一致しない場合は、サーバー側で追加処理が発生し、パフォーマンスが低下します。

この不一致によるパフォーマンス関連の問題を回避するには、次のいずれかを実行できます。

  • 表がすでに存在する場合は、スキャフォールディングを使用してリレーショナル・データベース表に対応するエンティティ・クラスを生成します。これにより、表の列ごとに正しいFluent APIが生成されます。

  • 対応するデータベース表がないエンティティ・クラスが存在する場合は、移行を使用して文字列エンティティ・プロパティに対応するデータベース列を生成します。この列では、呼び出されるIsUnicode()またはHasColumnType() Fluent APIを受け入れます。

  • データベース表に対応するエンティティ・クラスを手動で作成する場合は、適切なIsUnicode()またはHasColumnType() Fluent APIを使用して、各文字列エンティティ・プロパティをNVARCHAR2またはVARCHAR2列タイプに正しくマップし、不一致を回避します。

その他の考慮事項:

  • IsUnicode()とHasColumnType()のFluent APIがどちらも使用されている場合は、HasColumnType() Fluent APIが優先されます。

  • 移行の場合、.NET Stringエンティティ・プロパティはデフォルトでNVARCHAR2にマップされます。スキャフォールディングの場合、VARCHAR2列とNVARCHAR2列の両方が.NET Stringにマップされます。

  • データベース列タイプがVARCHAR2の場合は、IsUnicode(false)またはHasColumnType("VARCHAR2(<length>)") Fluent APIを使用して、文字列エンティティ・プロパティをVARCHAR2列に正しくマップする必要があります。これにより、パフォーマンス低下の問題を回避できます。

  • 文字列エンティティ・プロパティがNVARCHAR2列に関連付けられている場合、IsUnicode()とHasColumnType()のどちらのFluent APIも呼び出す必要はありません。あるいは、IsUncode(true)またはHasColumnType("NVARCHAR2(<length>)") Fluent APIを呼び出して、データをNVARCHAR2としてバインドできます。

  • Oracle.EntityFrameworkCore 2.19.70以前のバージョンでは、LINQ問合せの実行中に文字列エンティティ・プロパティ値は常にVARCHAR2としてバインドされました。Oracle EF Core 2.19.80以降、その動作は変更されました。文字列エンティティ・プロパティ値は、エンティティ文字列プロパティに指定されたマッピングに基づいてバインドされるようになりました。Oracle EF Core 2.19.70で最適に実行されていたアプリケーションは、新しいバージョンのOracle EF Coreにアップグレードするとパフォーマンスが低下する可能性があります。

  • Oracle EF Coreのアップグレード後に新しいパフォーマンスの問題が発生した場合は、VARCHAR2列に関連付けられている文字列エンティティ・プロパティで、IsUnicode(false)とHasColumnType("VARCHAR2(<length>)")のどちらのFluent APIも、また同等のデータ注釈も設定されていないことを確認します。されていない場合は、これらのFluent APIのいずれかを追加して、文字ベースのデータが正しいタイプを使用してバインドされるようにします。