随笔 - 1  文章 - 50  评论 - 22  阅读 - 37万

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,但由于这个省略曾经引起转换失败,索引没有被触发使用,引起严重的性能问题。

posted on   BadTree  阅读(1886)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示