EF Core生成Oracle迁移脚本时DropIndex遗漏Schema前缀问题
EF Core 对接Oracle生成迁移脚本DropIndex缺失Schema前缀问题
问题表现
通过Entity Framework Core CodeFirst模式对接Oracle数据库时,执行Script-Migration或dotnet ef migrations script命令基于现有迁移生成SQL脚本,会出现索引删除语句执行失败的问题:
迁移代码中已经明确为DropIndex操作指定了Schema参数:
migrationBuilder.DropIndex( name: "IX_CAR_CAR_ID", schema: "AUTO", table: "CARS", column: "CAR_ID");
按照预期应该生成带Schema前缀的删除语句:
DROP INDEX "AUTO"."IX_CAR_CAR_ID"
但实际生成的SQL缺失Schema前缀,直接执行会抛出对象不存在的错误:
DROP INDEX "IX_CAR_CAR_ID"
临时规避方法
可以手动修改迁移文件,不使用封装的DropIndex方法,改为直接执行原生SQL语句临时绕过问题,但该方案不能修复根因:
migrationBuilder.Sql("DROP INDEX \"AUTO\".\"IX_CAR_CAR_ID\"")
交叉验证结果
使用完全相同的迁移代码对接SQL Server数据库时,生成的脚本逻辑完全正常,会正确携带Schema拼接语句:
DROP INDEX [IX_CAR_CAR_ID] ON [AUTO].[CARS];
验证结果说明该问题仅在Oracle场景下出现,和EF Core核心框架逻辑无关。
问题结论
该问题是Oracle.EntityFrameworkCore 5.21.61版本的已知Bug:Oracle官方提供的EF Core数据库提供程序在生成DropIndex对应的SQL逻辑时,没有读取传入的schema参数,未给索引名称拼接所属Schema前缀,最终生成了不符合Oracle语法要求的语句。
当前验证环境组件版本
- Microsoft.EntityFrameworkCore:5.0.17
- Oracle.EntityFrameworkCore:5.21.61
内容的提问来源于stack exchange,提问作者Piotr Lewandowski
相关产品推荐
相关产品推荐

