如何在生产服务器不安装ODP.NET Managed Access部署Oracle+EF应用
无需安装ODAC的Oracle EF应用部署方案
我之前做Oracle + EF数据库优先项目时,也纠结过要不要在生产服务器装ODAC,摸索出几个不用装就能部署的方案,亲测有效:
方案1:完全依赖NuGet包(推荐)
这是最贴合你本地开发模式的方案,只要确保NuGet包配置正确,就能直接打包部署:
- 确认你的项目已经安装了这两个NuGet包:
Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework(版本尽量和你本地开发用的一致) - 修改你的
app.config/web.config:- 添加Oracle驱动的配置节点(放在
<configuration>下):<oracle.manageddataaccess.client> <version number="*"> <dataSources> <!-- 如果用直连字符串可以不用这个,要是习惯TNS名称就在这里配置 --> <dataSource alias="MyOracleDB" descriptor="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=你的Oracle服务器IP)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=你的服务名)))" /> </dataSources> </version> </oracle.manageddataaccess.client> - 配置EF的Provider(在
<entityFramework>节点下):<providers> <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" /> </providers> - 调整连接字符串,确保使用Managed驱动:
<connectionStrings> <add name="MyOracleEntities" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string="data source=MyOracleDB;user id=用户名;password=密码;"" providerName="System.Data.EntityClient" /> </connectionStrings>
- 添加Oracle驱动的配置节点(放在
- 发布项目时,检查输出目录里是否包含
Oracle.ManagedDataAccess.dll和Oracle.ManagedDataAccess.EntityFramework.dll,如果没有,在Visual Studio里选中这两个dll,设置复制到输出目录为「始终复制」
方案2:嵌入TNS配置到应用配置文件
如果你习惯用TNS别名但不想在服务器上放tnsnames.ora,可以把TNS配置直接写到app.config/web.config里:
- 在
<oracle.manageddataaccess.client>节点下加入:<settings> <setting name="TNS_ADMIN" value="." /> <!-- 这里设置为当前目录,不用实际存在tns文件 --> </settings> <dataSources> <dataSource alias="YourTNSAlias" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxx)))" /> </dataSources> - 这样连接字符串里直接用
data source=YourTNSAlias就行,不需要额外的TNS文件
方案3:使用独立的Oracle配置文件
如果不想把Oracle配置混在主配置里,可以单独创建一个oracle.manageddataaccess.client.config文件,内容就是Oracle的配置节点:
<?xml version="1.0" encoding="utf-8"?> <oracle.manageddataaccess.client> <version number="*"> <dataSources> <dataSource alias="MyOracleDB" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxx)))" /> </dataSources> </version> </oracle.manageddataaccess.client>
然后在主app.config/web.config的<configuration>节点下引用这个文件:
<configSections> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </configSections> <oracle.manageddataaccess.client configSource="oracle.manageddataaccess.client.config" />
发布时把这个独立配置文件一起打包到输出目录即可
注意事项
- 不要用旧的
Oracle.DataClient驱动,必须全程使用Oracle.ManagedDataAccess.Client,否则会依赖GAC里的ODAC组件 - 确认生产服务器的.NET Framework版本和你本地开发的一致,避免版本兼容性问题
- 应用池的运行账户需要有读取应用目录下dll和配置文件的权限,同时要有访问Oracle数据库服务器的网络权限
内容的提问来源于stack exchange,提问作者grayfieldmm




