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