部署和配置 ODP.NET 以在不安装实体框架的情况下工作

Posted

技术标签:

【中文标题】部署和配置 ODP.NET 以在不安装实体框架的情况下工作【英文标题】:Deploying and Configuring ODP.NET to work without installation with Entity Framework 【发布时间】:2012-11-23 03:33:55 【问题描述】:

如何?

A.如何部署和配置 Oracle.DataAccess.Client?

B.如何部署和配置 Oracle.ManagedDataAccess.Client?

C.您需要做什么才能使用 EDMX 和 Oracle SSDL 进行构建?

D.您需要安装什么来获得设计师支持?

【问题讨论】:

【参考方案1】:

这个答案总结了(希望)所有需要的步骤,其中许多都记录在网上的各个地方,可能会节省一些人在谷歌上搜索的时间。

A.如何部署和配置 Oracle.DataAccess.Client。

A.1。下载ODAC112030Xcopy_64bit.zip或ODAC112030Xcopy_32bit.zip。

A.1.1。将 zip 文件中以下文件夹的内容提取到您的应用程序/主机的 bin/setup 文件夹中:

A.1.1.1。即时客户端_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。将以下部分添加到应用程序/主机的 app.config/web.config 的开头(如果您已经有 configSections 元素,请将该部分添加到其中:

<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。将以下部分添加到应用程序/主机的 app.config/web.config 的末尾:

A.4。从 ODAC112030Xcopy 的文件夹运行:

configure.bat odp.net4 somename

我建议使用 oraclehome112030_32 或 oraclehome112030_64 作为上面的“somename”。

<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.如何部署和配置 Oracle.ManagedDataAccess.Client。

B.1。下载ODP.NET_Managed_1120350_Beta.zip

B.1.1。将以下文件提取到您的应用程序/主机的 bin/setup 文件夹中。

B.1.1.1。 Oracle.ManagedDataAccess.dll

B.1.1.2。 x64\Oracle.ManagedDataAccessDTC.dll 或 x86\Oracle.ManagedDataAccessDTC.dll

B.2。将以下部分添加到应用程序/主机的 app.config/web.config 的开头(如果您已经有 configSections 元素,请将该部分添加到其中:

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

B.3。将以下部分添加到应用程序/主机的 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.对于建筑:

C.1。将此部分添加到您的 EDMX 程序集的 app.config:

(还没有在 Oracle 上尝试过。ManagedDataAccess.Client)

<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。将名为 Oracle.xsd 的文件添加到同一个程序集,内容如下:

<?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。将上述 XSD 添加到上述 app.config 的 Schema 列表中。

C.4。如果您在构建过程中遇到布尔映射错误,即使构建成功,请将 app.config 映射添加到 Visual Studio 的 devenv.exe.config。

C.5。如果您想使用 Oracle.ManagedDataAccess.Client,请在构建之前手动编辑 EDMX 中的数据提供者属性(我没有尝试过),或者在运行时创建上下文之前对其进行编辑,然后从编辑后的副本而不是从资源(这似乎可行,我也使用类似的技巧来选择为不同的数据库提供程序加载哪个 MSSL)。


D.设计师支持:

D.1。下载win64_11gR2_client.zip或win32_11gR2_client.zip并安装。

D.1.1。选择“管理员”作为安装类型。

D.2。 download ODT 并安装。


我在一台装有 Windows 7 x64 的空白机器 (VM) 上尝试了这个(A 和 B)。

此过程似乎不适用于 Windows x64 上的 x86 版本的 Oracle.DataAccess.Client。

该过程似乎确实适用于 Windows x64 上的 x64 版本的 Oracle.DataAccess.Client 以及两个版本的 Oracle.ManagedDataAccess.Client。

【讨论】:

如何使用实体框架和 ODP.NET 托管驱动程序连接到 Oracle db?也许有用forums.oracle.com/forums/… 有更多相关信息吗? @Kiquenet 请参阅我的回答中的 B 部分。我在测试版中尝试了这个,它有点 工作 - 查询返回了不同的结果。 这里有两点需要考虑:1) 我必须将这些额外的 DLL 复制到我的 ASP.NET MVC bin 文件夹中:oci.dll、Oracle.DataAccess.dll(当然)、orannzsbb11.dll、 oraociei11.dll 和 OraOps11w.dll(复制相应的 x86/x64)。 2) 通过将 IIS 中的 App-Pool 设置为允许 32 位应用程序,我能够在 x64 机器上运行 x86 版本的应用程序。此外,当使用带有 Oracle.DataAccess 的实体框架时,Oracle 的 DLL 必须是 4.X+ 版本! (2.X 不起作用;这花了我一段时间才弄清楚:/) @Kiquenet 我会尝试并发布更新。我希望这个版本比它的前辈更好。 在最新客户端上添加了更新作为单独的答案 - 这个已经太长了:-)【参考方案2】:

更新:

从 Oracle.DataAccess.Client 迁移到 Oracle.ManagedDataAccess.Client v12.1.0 (12c) 的简单方法:

编辑: Download link for managed ODAC v12c Release 1.

如果您下载winx64_12c_client.zip 或winnt_12c_client32.zip,解压缩它们并在VM 上安装(完整(管理员)安装或使用ODP.NET 组件的自定义安装,客户端安装不包含此组件),您将找到文件夹@ “client”文件夹下的987654325@。

在此文件夹中,您将找到 common\Oracle.ManagedDataAccess.dllx86\Oracle.ManagedDataAccessDTC.dllx64\Oracle.ManagedDataAccessDTC.dll

Oracle.ManagedDataAccess.dll 复制到您的bin 目录中,然后将Oracle.ManagedDataAccessDTC.dll 的正确平台复制到您的x86/x64 bin 目录下,或者,对于每个客户端,将该特定DLL 的正确平台安装到GAC 中,将您的bin 保持为AnyCPU .

新DLL的汇编版本是4.121.1.0,PublicKeyToken好像是一样的(没查,没我改就可以了)。

和以前一样,将此部分添加到您的 app.config 配置/configSections(在 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>

system.data/DbProviderFactories下(在上面):

<system.data>
  <DbProviderFactories>

添加:

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

确保您的 machine.config 中没有任何冲突

然后添加:

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

并关闭:

  </DbProviderFactories>
</system.data>

注意我使用 Oracle.DataAccess.Client 作为不变量,而不是官方的Oracle.ManagedDataAccess.Client。这是因为我不想更改我的所有 EDMX 并重新编译它们的程序集以使它们使用新的托管客户端而不是旧的非托管客户端。

然后将以下部分(在上述之后)添加到您的 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>

这通过了我的初始测试,但尚未彻底测试。

【讨论】:

***.com/questions/7819861/… 怎么样? 也许您可以使用 Oracle.ManagedDataAccess.Client 添加一个简单的示例。 @Kiquenet For EF 不需要样本 - 由于我以旧提供者的名称注册新提供者的技巧,因此可以正常工作。对于开箱即用的 ADO.NET,只需使用来自新 DLL 的反射创建新类型的 DbConnection。 @Kiquenet,直到 Oracle 使用所有 3 个 DLL(客户端、DTC32、DTC64)制作 NuGet 包并让客户端自动选择要链接的正确 DLL(按名称,每个版本使用单独的名称) 根据 sizeof(IntPtr),NuGet 包将无用。但是,感谢您的链接 - 我不知道 NuGet 包。如果您为 Oracle 工作,请要求 PM 改进这一点。 Oracle 的 Alex Keh 表示,2014 年夏季将推出支持实体框架代码优先的新版本 ODAC 托管驱动程序。

以上是关于部署和配置 ODP.NET 以在不安装实体框架的情况下工作的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET 实体框架 - 带有实体框架 6 的 Oracle

实体框架 6.0 和 oracle 11

有人在使用带有 Oracle 数据库的实体框架吗?

ODP.Net 中的连接字符串

ODP.NET TNS:无法解决错误

在不使用其他项目的情况下添加实体框架核心迁移