唯一推荐的 NuGet 包是 Oracle.ManagedDataAccess(v3.21.100+),它原生支持 .NET 5/6/7/8,已取代并归档 Oracle.ManagedDataAccess.Core;旧包必须卸载,否则引发类型找不到或程序集加载失败。
用哪个 NuGet 包?别装错 Oracle.ManagedDataAccess 和 Oracle.ManagedDataAccess.Core
现在唯一推荐的包是 oracle.manageddataaccess(v3.21.100+),它原生支持 .net 5/6/7/8,不再需要 oracle.manageddataaccess.core —— 后者已归档,且不更新。装错会导致运行时找不到 oracleconnection 类型,或报 system.io.filenotfoundexception: could not load file or assembly 'oracle.manageddataaccess.core'。
- 在项目文件中直接添加:
<packagereference include="Oracle.ManagedDataAccess" version="3.21.100"></packagereference>
- 如果旧项目还引用着
Oracle.ManagedDataAccess.Core,必须删掉,否则会和新包冲突 - .NET 6+ 的自包含发布(self-contained)默认不打包 Oracle 驱动的本地依赖(如 Windows 上的 ODP.NET native DLL),但这个包是纯托管实现,完全不需要额外 DLL
OracleConnectionStringBuilder 怎么设连接字符串才不连不上
手动拼接连接字符串容易漏掉关键参数,尤其在使用 Wallet 或 TLS 时;用 OracleConnectionStringBuilder 能避免格式错误和编码问题。
- 基础写法:
var builder = new OracleConnectionStringBuilder {<br> DataSource = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=mydb.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1)))",<br> UserID = "scott",<br> Password = "tiger"<br>};<br>using var conn = new OracleConnection(builder.ConnectionString); - 如果用 Oracle Wallet(推荐用于生产),必须设
ConnectionTimeout=15并显式关闭密码:builder.UserID = string.Empty;<br>builder.Password = string.Empty;<br>builder.IntegratedSecurity = true;
- 注意:
DataSource里不能有空格或换行;用 TNSNAMES.ORA 文件时,确保TNS_ADMIN环境变量指向正确路径,且该路径下有sqlnet.ora和tnsnames.ora
为什么 OracleConnection.Open() 卡住或抛 OracleInternal.ServiceObjects.OracleConnectionImpl.Connect 异常
这不是代码 bug,通常是网络、认证或 TLS 配置层面的问题,堆栈里出现 OracleConnectionImpl.Connect 基本可定位到握手失败。
- 先确认 Oracle 服务端是否启用 TLS:若启用了 SSL/TLS,客户端必须配
SSL_SERVER_DN_MATCH=yes和有效 Wallet,否则连接会 hang 15–30 秒后超时 - 检查防火墙和网络连通性:
tnsping在开发机上能通 ≠ .NET 进程能通,因为 .NET 运行在不同用户上下文(如 IIS 或容器里),TNS_ADMIN可能未继承 - Linux/macOS 下常见缺失 CA 证书:需把 Wallet 里的
cwallet.sso和根证书导入系统信任库,或在连接字符串加SSL_SERVER_CERT_DN="CN=..." - .NET 6+ 默认禁用旧 TLS 版本,若 Oracle DB 是 12.1 或更早,可能需要显式启用 TLS 1.1:
AppContext.SetSwitch("System.Net.Http.UseSslStream", false); // 不推荐,仅临时排查
EF Core 6+ 怎么配 Oracle Provider?别碰 Oracle.EntityFrameworkCore v6.x
官方 EF Core Provider 目前只支持到 EF Core 5(对应 Oracle.EntityFrameworkCore v5.21.x);EF Core 6+ 没有官方支持,强行用 v6.x 包会编译通过但运行时报 Method not found: 'Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder.HasIndex(System.String[])'。
- 方案一(推荐):继续用 EF Core 5 +
Oracle.EntityFrameworkCorev5.21.100,它完全兼容 .NET 6/7/8 运行时 - 方案二(无 EF 功能):纯 ADO.NET 操作,用
OracleConnection+OracleCommand,稳定、可控、无版本陷阱 - 方案三(实验性):社区维护的
Devart.Data.Oracle.EFCore(商业授权),支持 EF Core 6/7,但需单独购买许可
真正麻烦的不是连上数据库,而是搞清 Oracle 客户端行为在不同环境下的细微差异——比如 Wallet 加载时机、TNS 解析顺序、TLS 握手重试策略。这些不会报错,只会让你花半天时间怀疑代码,其实只是 TNS_ADMIN 少了个尾部斜杠。










