【问题标题】:Oracle Instant Client and Entity Framework trouble with configurationOracle Instant Client 和实体框架配置问题
【发布时间】:2012-04-12 07:22:23
【问题描述】:

我正在尝试了解并确定是否可以将 MVC、EF、ODAC 11.2.0.3 应用程序部署到安装了以前版本的 ODP.NET 的服务器上。我认为我可以使用 Oracle Instant Client,而不是更新服务器 ODP.NET(我不能)。

这可行吗?

1) 我将这些 dll 添加到我的项目中以支持 Instant Client

-Oracle.DataAccess.dll

-oci.dll

-ociw32.dll

-orannzsbb11.dll

-oraociei11.dll

-OraOps11w.dll

2) 接下来我更新了 dbProviderFactories 的 web.config

   <system.data>
    <DbProviderFactories>
    <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>

3)这(afaik)是如何在bin中使用Oracle dll而不是GAC

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" />
    <publisherPolicy apply="no" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

4) 最后是我的连接字符串

    <connectionStrings>
    <add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;
provider connection string=&quot;DATA SOURCE=XXX;PASSWORD=XXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

这是我收到的错误 找不到请求的 .Net Framework 数据提供程序。它可能没有安装。

我非常感谢这里的任何帮助。我比较新,还有很多东西要学。提前致谢。干杯

【问题讨论】:

  • 您下载了 XCOPY 版本吗?您是否查看过 XCOPY zip 文件中的 install.bat 和 configure.bat 文件在做什么?在您尝试手动执行操作之前,首先根据自述文件运行这些文件。
  • 嗨 Christian,我使用了 ODAC 11.2 Release 4 (11.2.0.3.0) 的通用安装程序,对于 Instant Client,我下载了该软件包并将 dll 复制到我的项目中。
  • 请下载 XCOPY 安装。它旨在避免您现在遇到的麻烦(复制dll并在没有任何指导的情况下进行配置)
  • 感谢这篇文章很有帮助。

标签: c# asp.net-mvc oracle entity-framework odac


【解决方案1】:

在 Web 配置的 &lt;DbProviderFactories&gt; 元素中添加 &lt;remove … /&gt; 部分,以删除任何现有的 Oracle 提供程序。 (在&lt;add&gt; 之前)

&lt;remove invariant ="Oracle.DataAccess.Client" /&gt;

【讨论】:

  • 杰里米成功了。正如Christian指出的那样,我认为我也有错误的dll。再次感谢大家的帮助!
  • 这也解决了我在 windows server 2012 上的问题。谢谢。
  • 对于遇到此问题的任何人,因为他们在 Oracle.DataAccess.Client 上收到关于 InvariantName 的 ConfigurationException:编辑您的 machine.config 以删除重复项。
【解决方案2】:

从您的问题看来,您需要仅使用 xcopy 部署权限来为您的应用程序和新版本的 ODP.net 部署更新。

由于您的应用程序正在更改,因此您不需要更改程序集绑定或 DbProviderFactories。 只需使用您的 edmx 等更新类库的 csproj 即可参考新的 ODP.net 版本,例如

<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" />

如果您的 tnsnames.ora 出现问题,则必须执行以下操作之一: a) 添加系统环境变量 TNS_ADMIN 指向 tnsnames.ora 的目录,或者 b) 将连接字符串更改为基于:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;

c) 看看您是否可以将 tnsnames.ora 的副本放在其他地方。

【讨论】:

  • 嗨,Arieh,我想我的问题并不清楚。这是一个新的 Web 应用程序,它使用 Oracle Instant Client 和来自 Oracle 的最新 ODAC,并支持 EF。我想将此部署到未安装最新 odp.net 的服务器
【解决方案3】:

这是我的 Xcopy 解决方案。

我把它贴在了

(https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181)

也是。

但我想我可以在这里发布我的 xml 而不会出现格式问题。

Nuget“packages.config”

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CommonServiceLocator" version="1.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Data" version="5.0.505.0" targetFramework="net35" />
  <package id="EntLibContrib.Data.OdpNet" version="5.0.505.0" targetFramework="net35" />
  <package id="Unity" version="2.1.505.2" targetFramework="net35" />
  <package id="Unity.Interception" version="2.1.505.2" targetFramework="net35" />
</packages>

app.config

(注意下面的&lt;clear /&gt; 标签。这可能需要也可能不需要,但我认为最好清除它们,因为您不知道 machine.config 文件中可能包含什么)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>


  <dataConfiguration defaultDatabase="OracleMainConnectionString">
  </dataConfiguration>

  <connectionStrings>

    <add name="OracleMainConnectionString"
         connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyOracleServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyServiceName)));User ID=MyUserName;Password=MyPassword;"
      providerName="Oracle.DataAccess.Client" />
  </connectionStrings>

  <appSettings>
    <add key="ExampleKey" value="ExampleValue" />
  </appSettings>

  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <add name="EntLibContrib.Data.OdpNet" invariant="EntLibContrib.Data.OdpNet" description="EntLibContrib Data OdpNet Provider" type="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" />
    </DbProviderFactories>
  </system.data>


</configuration>

我正在 x64 Windows 7 机器上开发。

我下载了: ODAC1120320Xcopy_32bit.zip (来自 oracle.com)

这是:

ODAC 11.2 Release 5 (11.2.0.3.20) 下载 XCopy 版本 [2012 年 9 月 11 日发布]

我解压了这个 zip 文件。

我搜索并找到了这些文件:

oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll

注意,当有 2 个同名文件时,我选择了“bin\2.x\”或“odp.net20\bin”版本来满足 3.5 框架的需要(我还没有使用 4.0)。

我把这些文件放在我的 .sln 文件所在的子文件夹中。

.\MySolution.sln
.\MyConsoleApplicationFolder\MyConsoleApp.csproj
.\ThirdPartyReferences\
.\ThirdPartyReferences\Oracle\

我把上面所有的文件都放在了

.\ThirdPartyReferences\Oracle\ 

文件夹

我使用“添加引用”将 Oracle.DataAccess.dll 的引用添加到“MyConsoleApp.csproj”csharp 项目。 (当然,这意味着浏览到“..\ThirdPartyReferences\Oracle\”)

我使用“构建后事件”来复制“额外”(又名“附件)”文件

我在后期构建活动中的台词是:

copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oci.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\orannzsbb11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oraociei11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\OraOps11w.dll $(TargetDir)*.*

请注意,我的后期构建事件替换了上述 URL 说明中的“如果更新则复制”。

当我运行我的项目时............我得到了一些缺少的 dll 错误。

注意: 在调用 EnterpriseLibrary.Data 对象的程序集中……你会得到“找不到 Microsoft.Practices.SomethingSomething 命名空间。只需继续添加对这些 dll 的引用(上面的 package.config 将下拉),直到错误消失。

就像这里是一个特定的:

"Could not load file or assembly 'Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified."

所以(当然是运行Nuget之后,要下载所有文件) 我去添加了一个参考:

\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll

这解决了问题。

我的 csharp 代码:(注意“select *”仅用于演示目的)

/*
    using System;
    using System.Data;
    using System.Data.Common;
    using Microsoft.Practices.EnterpriseLibrary.Data;
 */
public IDataReader EmployeesGetAll()
{

    IDataReader returnReader = null;

    try
    {

        Database db = DatabaseFactory.CreateDatabase();
        DbCommand dbc = db.GetSqlStringCommand("SELECT * FROM ( SELECT * FROM TEMPLOYEE ) WHERE ROWNUM <= 25");
        returnReader = db.ExecuteReader(dbc);
        return returnReader;

    }

    finally
    {
    }

}

它奏效了。

谢谢:

https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/#comment-181

我认为这使 ODP.NET 成为“xcopy”部署。

我仍然需要在干净的机器上进行测试才能确定。

但它是一天的结束............

=================

附加信息:

以上所有内容都是正确的。但是,我遇到了一个警告。 我正在使用“控制台应用程序”来测试我的代码。

当您将新的控制台应用程序添加到 Visual Studio 时,它默认为 x86。

如下所示:

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

编辑:(更新链接)

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

因此,当我将所有配置和代码以及其他内容放入一个真实项目(在 x64 位机器上设置为“任何 CPU”)时……我所做的一切都停止了工作。 :

稍作调整后...... 我在 oracle.com 上找到了这个文件 ODAC1120320Xcopy_x64.zip 然后我重复了上面所做的一切,但搜索了这个 x64 zip 文件的解压缩文件。

一切正常。

但是控制台应用程序的“x86”默认设置让我陷入了循环。

【讨论】:

【解决方案4】:

通过 Instant Client 部署 ODP.NET 时,我遇到了同样的错误(未找到数据提供程序)。我唯一需要做的就是将以下内容添加到我的 exe.config 文件中(在标签内)

<system.data>
<DbProviderFactories>
<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>

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多