.NET構成ファイルでカスタム・マッピングを構成して、Number(p,0)
Oracleデータ型のデフォルト・マッピングを上書きできます。このため、たとえば、デフォルトでInt16
にマップされているNumber(1,0)
を、カスタムで.NET Bool
型または.NET Byte
型にマップできます。
例4-1に、カスタム・マッピングを使用してNumber(1, 0)
Oracleデータ型をbool
EDM型にマップするapp.config
ファイルのサンプルを示します。また、この例では、Number(3,0)
をbyte
にマップし、Int16、Int32
およびInt64
データ型の最大精度をそれぞれ4、9および18に設定します。
例4-1 Number(p,0)データ型をカスタム・マップするアプリケーション構成ファイルのサンプル
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> </connectionStrings> <oracle.dataaccess.client> <settings> <add name="bool" value="edmmapping number(1,0)" /> <add name="byte" value="edmmapping number(3,0)" /> <add name="int16" value="edmmapping number(4,0)" /> <add name="int32" value="edmmapping number(9,0)" /> <add name="int64" value="edmmapping number(18,0)" /> </settings> </oracle.dataaccess.client> </configuration>
例4-2に、ODP.NET管理対象ドライバのサンプルapp.config
ファイルを示します。
例4-2 Numberデータ型をカスタム・マップするODP.NET管理対象ドライバのアプリケーション構成ファイルのサンプル
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.manageddataaccess.client> <version number="*"> <edmMappings> <edmMapping dataType="number"> <add name="bool" precision="1"/> <add name="byte" precision="3" /> <add name="int16" precision="4" /> <add name="int32" precision="9" /> <add name="int64" precision="18" /> </edmMapping> </edmMappings> </version> </oracle.manageddataaccess.client> </configuration>
例4-1と例4-2マッピングを次のようにカスタマイズしています。
Oracleタイプ | デフォルトのEDM型 | カスタムのEDM型 |
---|---|---|
Number(1,0) |
Int16 |
bool |
Number(2,0) からNumber(3,0) |
Int16 |
byte |
Number(4,0) |
Int16 |
Int16 |
Number(5,0) |
Int16 |
Int32 |
Number(6,0) からNumber(9,0) |
Int32 |
Int32 |
Number(10,0) |
Int32 |
Int64 |
Number(11,0) からNumber(18,0) |
Int64 |
Int64 |
Number(19,0) |
Int64 |
Decimal |
カスタム・マッピングによって、.NET/EDM型にマップされるOracle Number
型の最大精度が構成されます。このため、たとえば、前述のカスタム・アプリケーション構成ファイルでODP.NETを構成する際は、Int64
にデフォルトの範囲であるNumber(11,0)
からNumber(19,0)
ではなく、Int64
にNumber(10,0)
からNumber(18,0)
をマップするよう構成されます。
注意:
|
マッピングによってデータが.NET/EDM型およびNumber(p, s)
型の範囲内に適合することを確認する必要があります。Oracle Number
データに対して範囲が小さすぎる.NET/EDM型を選択した場合、データの取得時にエラーが発生します。また、.NET/EDM型を選択した場合に、対応するデータがOracle Number
列に対して大きすぎると、Oracle DatabaseにINSERTおよびUPDATEを行った際にエラーが発生します。
カスタム・マッピングを有効にするには、EDM作成の前に、.NET構成ファイルにマッピング情報を追加します。
マッピング情報を提供する前にすでにEDMが作成されている場合、Visual Studioツールを使用するか、または手動でマッピングを変更できます。Visual Studioを使用して、EDMの「Model Browser」ページに移動します。新しいデータ型のマッピングが必要な表を右クリックし、ポップアップ・メニューから「Table Mapping」を選択します。通常は画面の一番下に「Mapping Details」ウィンドウが表示されます。必要に応じて「Column Mappings」を更新します。
マッピングを追加または削除する必要がある場合、プロジェクトの既存のEDMXファイルのCSDLマッピング・セクションでTypeの値を見つけます。それらのTypeの値を、アプリケーションで使用する.NETデータ型に追加するか、削除します。次の例では、BOOLCOL
およびBYTECOL
のプロパティ・ネーム・タイプがCSDLに追加され、それぞれBooleanおよびByteにマップされています。
CSDLカスタマイズ前のマッピングの例:
<Property Name="INT16COL" Type="Int16" Nullable="false" />
CSDLカスタマイズ後のマッピングの例:
<Property Name="BOOLCOL" Type="Boolean" Nullable="false" /> <Property Name="BYTECOL" Type="Byte" Nullable="false" /> <Property Name="INT16COL" Type="Int16" Nullable="false" />
予定しているマッピングの変更に応じて、これらのカスタマイズの可能性を組み合せて使用できます。多数の表および多数の列でマッピングの変更が必要な場合、EDMXファイルを削除してデータ・モデルを再生成する方法が最も効率的です。少数の表および多数の列で変更が必要な場合、影響を受ける表を削除してEDMXファイルを保存し、「Update Model from Database...」を選択してこれらの表を再度含めます。単一の表および1つまたは2つの列のみで変更が必要な場合、手動で、または「Mapping Details」ウィンドウを使用してEDMXを変更します。
次の各項では、Identity属性およびVirtual列について説明します。
Oracle Database 12c (12.1)およびそれ以降のバージョンでは、Identity属性列の表またはビューをサポートしています。Oracleには、3つのIdentity属性タイプがあります。EDMウィザードによって、表またはビューを含むOracle Identity属性からデータ・モデルが生成される際に、3つのOracle Identity属性タイプのそれぞれについて、ODP.NETによって.edmx
ファイルのIdentity
にStoreGeneratedPattern
の値が設定されます。Identity属性に関連する列は、INSERT
中にサーバー生成値を使用します。したがって、アプリケーション開発者は、順番やトリガーを作成する必要がありません。.NETアプリケーション自体がIdentity属性を設定する場合、この値は無視されます。
Identity属性をサポートしていないOracle Database 11gリリース2 (11.2)およびそれ以前のバージョンでは、アプリケーション開発者は、モデル生成後にエンティティ・モデル・デザイナ・プロパティで、列のIdentity
にStoreGeneratedPattern
を手動で設定し、INSERT
トリガーを作成することができます。sys_guid()
のようなサーバー機能が列の値を生成できる場合は、データ・タイプによっては順番が必要ないこともあります。
Oracle Database 11g (11.1)およびそれ以降のバージョンでは、式をVirtual列(Generated列とも呼ばれる)として、ベース表に直接格納できます。Virtual列を挿入または更新することはできません。ODP.NETによって、Virtual列のEFモデルのComputed
にStoreGeneratedPattern
は、自動で設定されません。エラーを回避するために、アプリケーション開発者は、モデル生成後のVirtual列のComputed
にStoreGeneratedPattern
の値を追加するか、または変更する必要があります。これにより、SaveChanges()
の呼出し時に、Virtual列はINSERT
およびUPDATE
から除外されます。
.NET構成ファイルのカスタム・マッピングを変更した場合、変更によって発生した比較エラーを解決するには、データ・モデルを再生成します。
場合によっては、カスタム・マッピングを使用するプロジェクトがVisual Studioによってロードされる際に、カスタム・マッピングが原因で比較エラーが発生することがあります。この場合、次の回避策を使用できます。
Visual Studioのヘルプ「About Microsoft Visual Studio」を開きます。「OK」をクリックしてダイアログ・ボックスを終了します。
かわりに、Server Explorerで使用する接続を開きます。
プロジェクトを再コンパイルしてコンパイル・エラーを消去します。
ストアド・プロシージャのマッピングにカスタムINSERT、UPDATE
またはDELETE
ストアド・プロシージャを使用すると、次のエラーが発生する場合があります。
エラー2042: 指定されたパラメータ・マッピングが無効です。
これは、Number
パラメータがBoolean
属性にマップされた場合またはRAW
パラメータがGuid
属性にマップされた場合に発生します。
解決策として、SSDLでストアド・プロシージャのNumber
パラメータにPrecision="1"
を、RAWパラメータにMaxLength="16"
を手動で追加します。