如何解决System.InvalidCastException - 列包含NULL数据错误
解决EF Core访问Oracle视图时的System.InvalidCastException(NULL值导致)
问题根源
模型中定义的decimal是不可空值类型,但Oracle视图LAB_RESULTS对应的列存在NULL数据。EF Core在执行ToList()映射数据时,无法将数据库的DBNull转换为不可空的decimal,直接抛出System.InvalidCastException,提示"column contains NULL data"。
解决方案
方案一:修改模型属性为可空decimal(推荐)
直接将模型中对应数据库NULL列的decimal属性改为可空类型decimal?,EF Core会自动适配数据库的NULL值,无需额外处理。
示例修改:
// 原模型属性 public decimal ResultValue { get; set; } // 修改后 public decimal? ResultValue { get; set; }
方案二:查询时手动处理NULL值(不修改模型)
如果无法修改模型结构,可在查询阶段将NULL值转换为decimal的默认值(如0),避免类型转换失败。
仓储类Search方法修改示例:
public List<LabResult> Search() { return _context.LabResults .Select(lab => new LabResult { // 其他属性映射 ResultValue = lab.ResultValue ?? 0, // 将NULL转为0,可根据业务调整默认值 TestName = lab.TestName, PatientId = lab.PatientId }) .ToList(); }
方案三:配置EF Core值转换器(统一处理)
通过DbContext的模型配置,添加值转换器统一处理该属性的NULL转换逻辑,无需修改模型或查询代码。
DbContext配置示例:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<LabResult>() .Property(lab => lab.ResultValue) .HasConversion( input => input, // 写入数据库时的转换逻辑 output => output == null ? 0 : output // 读取时将NULL转为0 ); }
关于OracleDataReader.IsDBNull()的说明
你无需直接调用OracleDataReader.IsDBNull(),EF Core已封装了数据读取的底层逻辑。上述三种方案都是通过EF Core的上层API解决问题,底层会自动处理DBNull的判断与转换。
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

