EF Core Db First模式下Oracle Number(5)字段映射Int16引发数值溢出错误的解决求助
EF Core Db First模式下Oracle Number(5)字段映射Int16引发数值溢出错误的解决求助
各位好,我最近在开发一个基于.NET 5的Web应用,数据库用的是Oracle 12,通过Oracle.EntityFrameworkCore v5.21以Db First的方式生成实体类。现在遇到了一个数值溢出的问题,折腾了好久没解决,想请教下大家。
我的问题详情如下:
- 数据库里的
Personnel表(对应之前提到的TableA)中,IdNum字段类型是Number(5),但这个字段实际存储的数值范围在95000到96000之间 - EF Core自动生成实体时,把
IdNum字段映射成了short(即Int16)类型,而short的最大值只有32767,所以查询数据时直接抛出错误:Value was either too large or too small for an Int16 - 因为每次scaffolding都会重新生成
PortalDbContext类,所以我单独创建了MyPortalDbContext.cs文件,通过部分类扩展PortalDbContext的OnModelCreatingPartial方法来手动配置字段映射,尝试了两种方案但都没效果:
第一种方案,直接在partial方法里配置属性:
public partial class PortalDbContext { partial void OnModelCreatingPartial(ModelBuilder modelBuilder) { modelBuilder.Entity<Personnel>() .Property(e => e.IdNum) .HasColumnType("NUMBER(5)") .HasConversion<int>(); } }
第二种方案,使用IEntityTypeConfiguration进行配置:
public partial class PortalDbContext { partial void OnModelCreatingPartial(ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration(new PersonnelConfiguration()); } } public class PersonnelConfiguration : IEntityTypeConfiguration<Personnel> { public void Configure(EntityTypeBuilder<Personnel> builder) { builder.Property(e => e.IdNum) .HasColumnType("NUMBER(5)") .HasConversion<int>(); } }
我现在的需求是:即使数据库字段是Number(5),实体里的IdNum也能被映射成int或者decimal类型,这样就能容纳95000-96000的数值了,而且我没办法修改数据库的字段类型。
请问有没有什么有效的解决办法?
备注:内容来源于stack exchange,提问作者ilhank
相关产品推荐
相关产品推荐

