EntityFramework Core 3.1 ORA-01460: unimplemented or unreasonable conversion requested
最近 oracle 更新了EFCore (Oracle.EntityFrameworkCore) 终于支持EFCore (EntityFramework Core) 3.1
升级前:
1 <ItemGroup> 2 <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" /> 3 <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.8" /> 4 <PackageReference Include="Oracle.EntityFrameworkCore" Version="2.19.90" /> 5 </ItemGroup>
升级后:
1 <ItemGroup> 2 <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.8" /> 3 <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.8" /> 4 <PackageReference Include="Oracle.EntityFrameworkCore" Version="3.19.80" /> 5 </ItemGroup>
但升级以后大量出现以下Exception:
Exception:
Microsoft.EntityFrameworkCore.DbUpdateException: 'An error occurred while updating the entries. See the inner exception for details.' Inner Exception:
OracleException: ORA-01460: unimplemented or unreasonable conversion requested
查看文档,发现是由于c# 类型(byte[])存入 Oracle DB 中的 Blob 类型,在数据超出32K长度后会出现ORA-01460错误。Google、百度均无解决方案。
后因代码优化整理,发现Exception竟然突然消失,后经排查发现是一个ORACEL的小细节引起。
// 优化前 builder.Property(x => x.Photo).HasColumnName("PHOTO").HasColumnType("blob"); // 优化后 public class DbTypeNames { public const string Blob = "BLOB"; } builder.Property(x => x.Photo).HasColumnName("PHOTO").HasColumnType(DbTypeNames.Blob);
因使用 EntityFrameworkCore的 Fluent API 接口,在绑定 Column 时大量使用 HasColumnType,故将 DbType 集中使用常量处理,由于Oracle 编程规范都偏向大写,故所有的column type都改为大写。之后Exception消失。
总结:
在使用 Oracle 类库时,Column Name,Column Type 请完全使用大写。
小分享:
请尽量使用 HasColumnType 声明 POCO (Plain Ordinary C# Object) 属性的数据库类型。最开始的时候我一直是使用省略模式,在省略的情况下根据 Oracle 的官方文档,默认为 string -> varchar2,但由于这个省略曾经引起转换失败,索引没有被触发使用,引起严重的性能问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探