You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在生产服务器不安装ODP.NET Managed Access部署Oracle+EF应用

无需安装ODAC的Oracle EF应用部署方案

我之前做Oracle + EF数据库优先项目时,也纠结过要不要在生产服务器装ODAC,摸索出几个不用装就能部署的方案,亲测有效:

方案1:完全依赖NuGet包(推荐)

这是最贴合你本地开发模式的方案,只要确保NuGet包配置正确,就能直接打包部署:

  • 确认你的项目已经安装了这两个NuGet包:Oracle.ManagedDataAccessOracle.ManagedDataAccess.EntityFramework(版本尽量和你本地开发用的一致)
  • 修改你的app.config/web.config
    1. 添加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>
      
    2. 配置EF的Provider(在<entityFramework>节点下):
      <providers>
        <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" />
      </providers>
      
    3. 调整连接字符串,确保使用Managed驱动:
      <connectionStrings>
        <add name="MyOracleEntities" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;data source=MyOracleDB;user id=用户名;password=密码;&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
      
  • 发布项目时,检查输出目录里是否包含Oracle.ManagedDataAccess.dllOracle.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

火山引擎 最新活动