7月 162014
 
11月 222013
 

ODACの11g、12cにはOracle.ManagedDataAccessというのが追加されており、ネイティブコードが無くなったのでサーバー環境へのデプロイ時にODP.NETやOracleClientのインストールが不要になる!ということで、やり方を調べてみたメモ。

参考:oracle – Deploying and Configuring ODP.NET to work without installation with Entity Framework – Stack Overflow

これのBのパターンでうまく行った。

  • WCFサービスのホストプロジェクトなどDB接続が必要になるプロジェクトの参照にEntityFramewrokとOracle.ManagedDataAccessを追加し、ローカルコピーをTrueに
  • Web.config/App.configを以下のように設定
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client"
      type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>

  <connectionStrings>
    <add name="Entities" connectionString="metadata=res://*/Models.ORCL.csdl|res://*/Models.ORCL.ssdl|res://*/Models.ORCL.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string="data source=exampleserver:1521/ORCL;password=example;user id=example"" providerName="System.Data.EntityClient" />
  </connectionStrings>

  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver"
           invariant="Oracle.ManagedDataAccess.Client"
           description="Oracle Data Provider for .NET, Managed Driver"
           type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

  <oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1"/>
          <add name="byte" precision="2" />
          <add name="int16" precision="5" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>
  • 適当にデプロイ

Oracle.ManagedDataAccessDTC.dll が必要な場合

  • TransactionScope を使う場合など、Oracle.ManagedDataAccessDTC.dll が必要な時がある
    • 無いと実行時にFileNotFoundExceptionで死ぬ
  • Oracle.ManagedDataAccess.dllと同様に、実行パスかGACに入ってればOK
  • Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ を必要とする点に注意 (SP1じゃなくても大丈夫だとは思うが…)
    • これも同様に、インストールされていないと実行時にFileNotFoundExceptionで死ぬ
  • Oracle.ManagedDataAccessDTC.dll も Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ も32bit版と64bit版があるので、実行環境に合わせたものを使おう