必须使用 Oracle.ManagedDataAccess v23.x+,因其是 .NET 8 唯一官方支持的纯托管驱动;System.Data.OracleClient 已彻底移除,Oracle.DataAccess 因依赖 oci.dll 在跨平台场景下会抛 DllNotFoundException。

直接改 TargetFramework 不行,Oracle 客户端驱动和数据访问层在 .NET 8 中已彻底重构,必须换掉 System.Data.OracleClient(早已废弃)和旧版 ODP.NET for .NET Framework,否则编译失败或运行时抛 System.TypeLoadException。
确认当前 Oracle 访问方式是否被 .NET 8 支持
先查清你项目里用的是哪一套 Oracle 数据访问栈:
- 如果引用了
System.Data.OracleClient—— 立刻停用,.NET 8 完全移除该命名空间,连 NuGet 都不提供 - 如果用的是 Oracle.ManagedDataAccess(ODP.NET Managed Driver)v19.x 或更早 —— 必须升级到 v23.x+,否则
OracleConnection在 .NET 8 下可能因 TLS 1.3 或证书链验证失败而静默中断 - 如果依赖
Oracle.DataAccess(即“unmanaged”版本)—— 不能在 .NET 8 中加载,会报DllNotFoundException: oci.dll,尤其在 Linux/macOS 或容器中
替换为 Oracle.ManagedDataAccess.Core v23.4+
这是目前唯一官方支持 .NET 8 的纯托管驱动,无需本地 Oracle Client 安装:
- 卸载所有旧版 Oracle 包:
Oracle.ManagedDataAccess、Oracle.ManagedDataAccess.EntityFramework、System.Data.OracleClient - 安装新包:
dotnet add package Oracle.ManagedDataAccess.Core --version 23.4.0 - 代码中把命名空间从
using Oracle.DataAccess.Client;改成using Oracle.ManagedDataAccess.Client; -
OracleConnectionStringBuilder仍可用,但注意Connection Timeout默认单位是秒(不是毫秒),且Pooling默认开启,高并发下需显式设Max Pool Size=XXX
处理 EF6 → EF Core 8 迁移中的 Oracle 适配
如果你的项目用了 Entity Framework 6 + Oracle,EF6 无法运行在 .NET 8 上,必须切换到 EF Core 8:
- EF Core 8 原生不支持 Oracle —— 必须用第三方提供程序,推荐
Oracle.EntityFrameworkCorev8.0.0(对应 EF Core 8.0,由 Oracle 官方维护) - 不要用
Pomelo.EntityFrameworkCore.MySql或其他非 Oracle provider 混搭,会触发InvalidOperationException: No database provider has been configured -
OnConfiguring中注册 Oracle 需写成:options.UseOracle(connectionString, o => o.UseOracleSQLCompatibility("19c")),否则某些 DDL(如IDENTITY列)生成失败 - 原 EF6 的
Database.SqlQuery<T>要重写为 EF Core 的FromSqlRaw<T>,且参数必须用@p0形式,不能用命名参数(:param或@param会被忽略)
连接字符串与 TLS/加密兼容性陷阱
.NET 8 默认启用更严格的 TLS 和证书验证,Oracle 连接容易在此卡住:
- 若连 Oracle Cloud ATP 或自治数据库,连接字符串必须含
SSL_SERVER_CERT_DN="CN=adwc.uscom-central-1.oraclecloud.com",否则握手失败 - 本地 Oracle 12c/19c 若未配置 Wallet,需显式关 TLS:
Connection Timeout=60;SSL Enabled=False;(注意不是EnableSSL=false) - 遇到
ORA-28860: SSL handshake failed,优先检查服务器端是否启用了 TLS 1.2+,.NET 8 不再支持 TLS 1.0/1.1 - Windows 上若用
OracleConfiguration.TransactionScopeOption = TransactionScopeOption.Enabled,需额外引用System.Transactions.Local包,否则TransactionAbortedException无堆栈
最常被跳过的一步:Oracle 12c 及以上版本默认禁用 SEC_CASE_SENSITIVE_LOGON,但 .NET 8 的 OracleConnection 仍按老规则发送小写密码哈希 —— 如果数据库侧强制大小写敏感,必须在连接字符串加 Validate Connection=true 并确保密码字段原始大小写一致。


















