首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle Instant Client和Entity Framework的配置问题

Oracle Instant Client和Entity Framework的配置问题
EN

Stack Overflow用户
提问于 2012-03-29 00:34:32
回答 4查看 24.8K关注 0票数 8

我正在尝试学习并弄清楚是否可以将MVC,EF,ODAC11.2.0.3应用程序部署到安装了以前版本的ODP.NET的服务器上。我想我可以使用Oracle Instant Client,而不是更新服务器ODP.NET (我不能这样做)。

这可行吗?

1)我将这些dll添加到我的项目中以支持即时客户端

-Oracle.DataAccess.dll

-oci.dll

-ociw32.dll

-orannzsbb11.dll

-oraociei11.dll

-OraOps11w.dll

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

代码语言:javascript
复制
   <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)是如何使用Oracle动态链接库而不是GAC

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

4)最后是我的connectionString

代码语言:javascript
复制
    <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框架数据提供程序。它可能未安装。

我真的很感谢大家的帮助。我是个新手,有很多东西要学。提前谢谢。干杯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-03 01:58:15

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-29 15:57:26

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

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

代码语言:javascript
复制
<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" />

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

代码语言:javascript
复制
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的副本放在别的地方。

票数 1
EN

Stack Overflow用户

发布于 2013-01-23 06:27:30

这是我的Xcopy解决方案。

我把它贴在

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

也是。

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

Nuget "packages.config“

代码语言:javascript
复制
<?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

(请注意下面的<clear />标记。这可能需要,也可能不需要,但我认为最好将它们清除掉,因为您不知道machine.config文件中可能包含什么内容)

代码语言:javascript
复制
<?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 Windows7机器上开发的。

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

这是:

ODAC11.2 Release 5 (11.2.0.3.20)下载2012年9月11日发布的XCopy版本

我解压了这个压缩文件。

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

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

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

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

代码语言:javascript
复制
.\MySolution.sln
.\MyConsoleApplicationFolder\MyConsoleApp.csproj
.\ThirdPartyReferences\
.\ThirdPartyReferences\Oracle\

我将上面的所有文件放在

代码语言:javascript
复制
.\ThirdPartyReferences\Oracle\ 

文件夹

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

我使用了"Post Build Event“来复制"extra”(也称为“附件)”文件。

我在我的构建后事件中的代码是:

代码语言:javascript
复制
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)*.*

请注意,我的post build事件替换了上面URL说明中的"Copy if Newer“。

当我运行我的项目时,我得到了一些丢失的dll错误。

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

下面是一个具体的例子:

代码语言:javascript
复制
"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 *“仅用于演示目的)

代码语言:javascript
复制
/*
    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”)时,我所做的...everything停止了工作。:<

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

一切都很正常。

但是控制台应用程序的"x86“默认设置让我大吃一惊。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9911948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档