跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

.NET 7如何使用Entity Framework Core连接Oracle

支持,但必须用 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(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
和时间类型时,容易出现精度丢失或查询结果为空。 oracle知识库 oracle知识库下载 下载
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 脚本 —— 这是最容易被跳过的一步。

相关文章