Oracle Instant Client和Entity Framework配置出现问题
本文关键字:配置 问题 Framework Entity Instant Client Oracle | 更新日期: 2023-09-27 18:29:12
我正在努力学习并弄清楚是否可以将MVC、EF、ODAC 11.2.0.3应用程序部署到安装了以前版本的ODP.NET的服务器上。我认为我可以使用Oracle Instant Client,而不是更新服务器ODP.NET(我不能)。
这可行吗?
1) 我将这些dll添加到我的项目中,以支持即时客户端
-Oracle.DataAccess.dll
-oci.dll
-ociw32.dll
-oranzsbb11.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 rathre中使用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) 最后我的connectionString
<connectionStrings>
<add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;
provider connection string="DATA SOURCE=XXX;PASSWORD=XXX;PERSIST SECURITY INFO=True;USER ID=XXX"" providerName="System.Data.EntityClient" />
</connectionStrings>
这是我收到的错误找不到请求的.Net Framework数据提供程序。可能未安装。
我真的很感激这里的任何帮助。我是个新手,有很多东西要学。提前谢谢。cheers
在web配置的<DbProviderFactories>
元素中添加<remove … />
部分,以删除任何现有的Oracle提供程序。(<add>
之前)
<remove invariant ="Oracle.DataAccess.Client" />
从您的问题来看,您似乎需要仅使用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的副本放在其他地方。
这是我的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
(注意下面的<clear />
标签。这可能需要也可能不需要,但我认为最好清除它们,因为你不知道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.dllOracle.DataAccess.dlloranzsbb11.dlloraociei11.dllOraOps11w.dll
注意,当有两个同名文件时,我选择了"bin''2.x''"或"odp.net20''bin"版本来满足我的3.5 Framework需求(我还没有使用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代码:(注意"选择*"仅用于演示目的)
/*
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"部署。
我还需要在一台干净的机器上测试才能确定。
但这是一天的结束。。。。。。。。。。。。。。
====================
附加信息:
以上内容都是正确的。然而,我提出了一个警告。我使用"控制台应用程序"来测试我的代码。
将新的控制台应用程序添加到visualstudio时,它默认为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"默认设置让我陷入了一个循环。
我在通过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>