ヘッダーをスキップ
Oracle® Data Provider for .NET開発者ガイド
12c リリース1(12.1)
B72971-07
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

Oracle Numberデータ型のデフォルト・マッピングおよびカスタマイズ

.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)ではなく、Int64Number(10,0)からNumber(18,0)をマップするよう構成されます。


注意:

  • カスタム・マッピングでは、すべての.NET/EDM型をマップする必要はありません。たとえば、Int16についてのみカスタム・マッピングが必要な場合は、Int16に単一のエントリを行うことができます。他の型には、デフォルト・マッピングが使用されます。

  • Model Firstを使用している場合は、デフォルトでNumber(3,0)Byte属性がマップされます。ただし、Number(3,0)列にモデルが生成されている場合は、Byteにカスタム・マッピングを指定しないかぎり、デフォルトでInt16にマップされます。

  • Entity Framework 6のネイティブ・アプリケーションに対するODP.NET管理対象ドライバおよび管理対象外ドライバの.NET構成ファイル設定は、従来の.NET構成ファイル設定とはフォーマットが異なっています。このフォーマットの詳細は、ODP.NET READMEを参照してください。このREADMEでは、Entity Framework 5アプリケーションからEntity Framework 6に移行する際の、ODP.NET固有の手順も説明されています。


マッピングによってデータが.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を変更します。

StoreGeneratedPattern列挙体

次の各項では、Identity属性およびVirtual列について説明します。

Identity属性

Oracle Database 12c (12.1)およびそれ以降のバージョンでは、Identity属性列の表またはビューをサポートしています。Oracleには、3つのIdentity属性タイプがあります。EDMウィザードによって、表またはビューを含むOracle Identity属性からデータ・モデルが生成される際に、3つのOracle Identity属性タイプのそれぞれについて、ODP.NETによって.edmxファイルのIdentityStoreGeneratedPatternの値が設定されます。Identity属性に関連する列は、INSERT中にサーバー生成値を使用します。したがって、アプリケーション開発者は、順番やトリガーを作成する必要がありません。.NETアプリケーション自体がIdentity属性を設定する場合、この値は無視されます。

Identity属性をサポートしていないOracle Database 11gリリース2 (11.2)およびそれ以前のバージョンでは、アプリケーション開発者は、モデル生成後にエンティティ・モデル・デザイナ・プロパティで、列のIdentityStoreGeneratedPatternを手動で設定し、INSERTトリガーを作成することができます。sys_guid()のようなサーバー機能が列の値を生成できる場合は、データ・タイプによっては順番が必要ないこともあります。

Virtual列

Oracle Database 11g (11.1)およびそれ以降のバージョンでは、式をVirtual列(Generated列とも呼ばれる)として、ベース表に直接格納できます。Virtual列を挿入または更新することはできません。ODP.NETによって、Virtual列のEFモデルのComputedStoreGeneratedPatternは、自動で設定されません。エラーを回避するために、アプリケーション開発者は、モデル生成後のVirtual列のComputedStoreGeneratedPatternの値を追加するか、または変更する必要があります。これにより、SaveChanges()の呼出し時に、Virtual列はINSERTおよびUPDATEから除外されます。

カスタム・マッピングの使用時の比較エラーの解決

.NET構成ファイルのカスタム・マッピングを変更した場合、変更によって発生した比較エラーを解決するには、データ・モデルを再生成します。

場合によっては、カスタム・マッピングを使用するプロジェクトがVisual Studioによってロードされる際に、カスタム・マッピングが原因で比較エラーが発生することがあります。この場合、次の回避策を使用できます。

  1. Visual Studioのヘルプ「About Microsoft Visual Studio」を開きます。「OK」をクリックしてダイアログ・ボックスを終了します。

    かわりに、Server Explorerで使用する接続を開きます。

  2. プロジェクトを再コンパイルしてコンパイル・エラーを消去します。

カスタムINSERT、UPDATEおよびDELETEストアド・プロシージャでのブール・パラメータおよびguidパラメータのマッピング

ストアド・プロシージャのマッピングにカスタムINSERT、UPDATEまたはDELETEストアド・プロシージャを使用すると、次のエラーが発生する場合があります。

エラー2042: 指定されたパラメータ・マッピングが無効です。

これは、NumberパラメータがBoolean属性にマップされた場合またはRAWパラメータがGuid属性にマップされた場合に発生します。

解決策として、SSDLでストアド・プロシージャのNumberパラメータにPrecision="1"を、RAWパラメータにMaxLength="16"を手動で追加します。