Deploying and Configuring ODP.NET to work without installation with Entity Framework

Solution 1:

This answer summarizes (hopefully) all the steps required, many of which documented in various places online and might save someone hours of Googling.

A. How to deploy and configure Oracle.DataAccess.Client.

A.1. Download ODAC112030Xcopy_64bit.zip or ODAC112030Xcopy_32bit.zip.

A.1.1. Extract the content of the following folders within the zip file into your application/host's bin/setup folder:

A.1.1.1. instantclient_11_2

A.1.1.2. odp.net4\bin\

A.1.1.3. odp.net4\odp.net\bin\

A.1.1.4. odp.net4\odp.net\PublisherPolicy\4\

A.2. Add the following section to the beginning of your application's/host's app.config/web.config (if you already have a configSections element, add the section to it:

<configSections>
  <section name="oracle.dataaccess.client"
    type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

A.3. Add the following sections to the end of your application's/host's app.config/web.config:

A.4. From the ODAC112030Xcopy's folder Run:

configure.bat odp.net4 somename

I recommend using oraclehome112030_32 or oraclehome112030_64 as the "somename" above.

<system.data>
  <DbProviderFactories>
    <!-- Remove in case this is already defined in machine.config -->
    <remove invariant="Oracle.DataAccess.Client" />
    <add name="Oracle Data Provider for .NET"
         invariant="Oracle.DataAccess.Client"
         description="Oracle Data Provider for .NET"
         type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </DbProviderFactories>
</system.data>

<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(5,0)" />
    <add name="int32" value="edmmapping number(10,0)" />
    <add name="int64" value="edmmapping number(19,0)" />
    <add name="int16" value="edmmapping number(38,0)" />
    <add name="int32" value="edmmapping number(38,0)" />
    <add name="int64" value="edmmapping number(38,0)" />
  </settings>
</oracle.dataaccess.client>




B. How to deploy and configure Oracle.ManagedDataAccess.Client.

B.1. Download ODP.NET_Managed_1120350_Beta.zip

B.1.1. Extract the following files into your application/host's bin/setup folder.

B.1.1.1. Oracle.ManagedDataAccess.dll

B.1.1.2. x64\Oracle.ManagedDataAccessDTC.dll or x86\Oracle.ManagedDataAccessDTC.dll

B.2. Add the following section to the beginning of your application's/host's app.config/web.config (if you already have a configSections element, add the section to it:

<configSections>
  <section name="oracle.manageddataaccess.client"
    type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.112.3.50, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>

B.3. Add the following sections to the end of your application's/host's app.config/web.config:

<system.data>
  <DbProviderFactories>
    <!-- Remove in case this is already defined in machine.config -->
    <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.112.3.50, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </DbProviderFactories>
</system.data>

<oracle.manageddataaccess.client>
  <version number="*">
    <settings>
      <!-- Set this path if you are using TNS aliases as connection strings (not recommended) -->
      <!-- Instead you can use "SERVER_NAME:PORT/SERVICE_NAME" as your data source -->
      <setting name="TNS_ADMIN" value="C:\"/>
    </settings>
    <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>




C. For building:

C.1. Add this section to your EDMX's assembly's app.config:

(Haven't tried this with Oracle.ManagedDataAccess.Client yet)

<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(5,0)" />
    <add name="int32" value="edmmapping number(10,0)" />
    <add name="int64" value="edmmapping number(19,0)" />
    <add name="int16" value="edmmapping number(38,0)" />
    <add name="int32" value="edmmapping number(38,0)" />
    <add name="int64" value="edmmapping number(38,0)" />
  </settings>
</oracle.dataaccess.client>

C.2. Add a file named Oracle.xsd to the same assembly with the content:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="odpnetappconfigmappings" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="addtype">
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="value" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="settingstype">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="add" type="addtype" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="oracledataaccessclienttype">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element name="settings" type="settingstype" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="oracle.dataaccess.client" type="oracledataaccessclienttype" />

</xs:schema>

C.3. Add the above XSD to the above app.config's list of Schemas.

C.4. If you are getting errors for boolean mappings during build even though build is succeeding, add the app.config mappings to Visual Studio's devenv.exe.config.

C.5. If you want to use Oracle.ManagedDataAccess.Client, either edit data provider attribute in the EDMX manually prior to build (I have not tried this) or edit it prior to creation of Context at run time and load MSSL from edited copy instead of from resource (this seems to work and I also use a similar trick to choose which MSSL to load for different DB providers).




D. For designer support:

D.1. Download win64_11gR2_client.zip or win32_11gR2_client.zip and install.

D.1.1. Select "Administrator" as type of installation.

D.2. download ODT and install.




I tried this (A and B) on a blank machine (VM) with Windows 7 x64.

This procedure does not seem to work with x86 version of Oracle.DataAccess.Client on Windows x64.

The procedure does seem to work with the x64 version of Oracle.DataAccess.Client on Windows x64 and with both versions of Oracle.ManagedDataAccess.Client.

Solution 2:

Update:

Migrating from Oracle.DataAccess.Client to Oracle.ManagedDataAccess.Client v12.1.0 (12c) the easy way:

Edit: Download link for managed ODAC v12c Release 1.


If you download winx64_12c_client.zip or winnt_12c_client32.zip, extract them and install (full (admin) installation or custom installation with ODP.NET component, client installation doesn't include this component) on a VM, you'll find the folder \odp.net\managed under the "client" folder.

Within this folder you will find common\Oracle.ManagedDataAccess.dll, x86\Oracle.ManagedDataAccessDTC.dll and x64\Oracle.ManagedDataAccessDTC.dll.

Copy Oracle.ManagedDataAccess.dll into your bin directory and either copy the correct platform of Oracle.ManagedDataAccessDTC.dll under your x86/x64 bin directory or, per client, install the correct platform of that specific DLL into the GAC, keeping your bin as AnyCPU.

The assembly version of the new DLL is 4.121.1.0, the PublicKeyToken seems to be the same (didn't check it, but it worked without me changing it).

As before, add this section to your app.config configuration/configSections (at the beginning of the app.config file):

<configuration>
   <configSections>

Section:

    <section name="oracle.manageddataaccess.client"
        type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

and close with:

</configSections>

Under system.data/DbProviderFactories (after the above):

<system.data>
  <DbProviderFactories>

add:

    <remove invariant="Oracle.DataAccess.Client" />
    <remove invariant="Oracle.ManagedDataAccess.Client" />

To make sure you don't have any conflicts in your machine.config

then add:

  <add name="ODP.NET, Managed Driver" invariant="Oracle.DataAccess.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" />

and close with:

  </DbProviderFactories>
</system.data>

Notice I used Oracle.DataAccess.Client as the invariant instead of the official Oracle.ManagedDataAccess.Client. This is because I do not want to change all my EDMXs and recompile their assemblies to get them to use the new managed client instead of the old unmanaged one.

Then add the following section (after the above) to your app.config

 <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>

This passed my initial testing, haven't tested thoroughly yet though.