支持,但必须用 Oracle 官方维护的 Oracle.EntityFrameworkCore 8.0+ 版本;EF Core 7 不自带 Oracle 驱动,社区包已弃用,需安装 8.21.40+ 版本并配置 Oracle 客户端与正确连接字符串。
Oracle.EntityFrameworkCore 包是否支持 .NET 7?
支持,但必须用 oracle 官方维护的 oracle.entityframeworkcore 8.0+ 版本。ef core 7 默认不带 oracle 驱动,microsoft.entityframeworkcore.oracle 是社区旧包(已弃用),不能用;用它会在 dotnet build 时直接报错 could not load type 'oracle.entityframeworkcore.infrastructure.oracledbcontextoptionsbuilder'。
确认方式:查 NuGet 页面,Oracle.EntityFrameworkCore 8.21.40(或更高)明确标注支持 net6.0 和 net7.0。
- 安装命令:
dotnet add package Oracle.EntityFrameworkCore --version 8.21.40 - 同时需安装 Oracle 客户端运行时(如 Oracle Instant Client 21c),否则运行时报
System.DllNotFoundException: Unable to load DLL 'oci.dll' - 若项目是 Linux/macOS,要额外设环境变量
LD_LIBRARY_PATH(Linux)或LIBRARY_PATH(macOS)指向libclntsh.so所在目录
如何配置 DbContext 使用 Oracle 连接字符串?
Oracle 的连接字符串格式和 SQL Server 差异较大,EF Core 7 不会自动转换,必须显式传入完整 Oracle 连接串(不是简化的 TNS 别名),否则 DbContextOptionsBuilder.UseOracle() 会静默失败或抛出 Oracle.ManagedDataAccess.Client.OracleException: ORA-12154。
推荐用 Easy Connect 格式,避免依赖本地 tnsnames.ora:
string connectionString = "User Id=hr;Password=hr;Data Source=localhost:1521/XE";
在 Program.cs 中注册:
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseOracle(connectionString, o => o.UseOracleSQLCompatibility("19")))
-
UseOracleSQLCompatibility("19")很关键:告诉驱动按 Oracle 19c 语法生成 SQL,否则 EF Core 7 可能生成不兼容的OFFSET ... FETCH或序列语法,导致分页或插入失败 - 如果数据库是 Oracle 12c,改用
"12";不设此项时默认为"11",很多新特性会禁用 - 连接字符串里不要加
Pooling=true(Oracle 驱动默认开启连接池),手动加反而可能引发ORA-24417
Oracle 数据类型映射常见坑有哪些?
EF Core 7 对 Oracle 类型的默认映射不如 SQL Server 稳定,尤其涉及 NUMBER、VARCHAR2 和时间类型时,容易出现精度丢失或查询结果为空。
-
NUMBER(10,0)→ 应映射为int,但若没在实体中用[Column(TypeName = "NUMBER(10,0)")]显式声明,EF 可能当decimal处理,导致比较失效 -
DATE在 Oracle 中含时分秒,但 EF Core 默认映射为DateTime且忽略毫秒,若业务依赖毫秒级精度,必须用Timestamp类型 +[Column(TypeName = "TIMESTAMP")] -
VARCHAR2(1)字段对应char时,Oracle 驱动会补空格,建议统一用string+[StringLength(1)] - 主键用序列(Sequence)时,别用
[DatabaseGenerated(DatabaseGeneratedOption.Identity)],而要用HasSequence()+UseIdentityColumn()配合迁移生成
执行迁移(migrationBuilder)为什么总卡住或报 ORA-00942?
Oracle 不支持 IF NOT EXISTS,EF Core 7 的迁移脚本默认包含对系统表(如 USER_TABLES)的检查逻辑,但在某些 Oracle 权限模型下(如只给应用用户 CREATE TABLE 而非 SELECT ANY DICTIONARY),会因查不到 USER_TABLES 报 ORA-00942: table or view does not exist。
解决方法不是提权,而是绕过检查:
- 生成迁移时加
--no-build参数避免重复编译干扰:dotnet ef migrations add Init --no-build - 迁移前手动确保用户有
CREATE SEQUENCE和CREATE TRIGGER权限(序列和触发器常被忽略) - 首次迁移执行前,先在 SQL*Plus 里跑
CREATE TABLE "__EFMigrationsHistory" (MigrationId NVARCHAR2(150) PRIMARY KEY, ProductVersion NVARCHAR2(32)),避免 EF 自己建表时权限不足 - 如果用
dotnet ef database update卡住,改用dotnet ef migrations script --output deploy.sql导出 SQL 手动执行,更可控
Oracle 的大小写敏感、双引号包裹标识符、序列触发器绑定这些细节,在 EF Core 7 里不会自动适配,得靠人工核对生成的 SQL 脚本 —— 这是最容易被跳过的一步。


















