You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:20:34