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

EF Core 6中System.DBNull强制转换异常求助

问题分析与解决方案

异常核心原因

你遇到的「无法将'System.DBNull'转换为'System.String'」异常,主要来自两个方面:

  1. 关联对象未显式加载:GetCor方法仅查询producao_ecra表,未主动加载关联的Ecra和Cor_Ecra对象,EF延迟加载时若关联数据缺失或字段为NULL,会触发类型转换异常。
  2. 数据完整性问题:对应Pdc_Ecra记录的关联Ecra/Cor_Ecra记录不存在,或Cor_Ecra.CE_Nome字段在数据库中为NULL,但实体模型定义为非可空字符串,导致EF无法完成DBNull到String的转换。

修复步骤

1. 修改GetCor方法,显式加载关联数据并增加空值校验

修改方法,主动Include关联对象,同时增加多层空值判断,避免空引用和类型转换错误:

public string GetCor(int id)
{
    // 显式加载关联的Ecra和Cor_Ecra,避免延迟加载的潜在问题
    var item = _db.producao_ecra
        .Include(pe => pe.Ecra)
            .ThenInclude(e => e.Cor_Ecra)
        .FirstOrDefault(t => t.PE_Id == id);

    // 多层空值检查,确保每一层对象都存在,同时处理CE_Nome为NULL的情况
    if (item != null && item.Ecra != null && item.Ecra.Cor_Ecra != null)
    {
        return item.Ecra.Cor_Ecra.CE_Nome ?? string.Empty;
    }

    return string.Empty;
}

2. 检查数据库数据完整性

  • 确认producao_ecra表中对应PE_Id的记录,其PE_ecra_Id在ecra表存在有效匹配;
  • 确认该ecra记录的ecra_CE_Id在cor_ecra表存在有效匹配;
  • 检查cor_ecra表中对应记录的CE_Nome字段是否为NULL:若为NULL,可根据业务需求设置默认空字符串,或修改实体模型将CE_Nome定义为可空字符串(.NET 6+ 可改为public string? CE_Nome { get; set; })。

3. 验证数据库外键约束

确保以下外键约束已正确配置,避免无效外键值:

  • producao_ecra.PE_ecra_Id关联ecra.ecra_Id;
  • ecra.ecra_CE_Id关联cor_ecra.CE_Id;

4. 优化Vecras方法的插入逻辑

在创建Pdc_Ecra前,增加关联数据有效性检查,避免插入无效外键数据:

// 在创建pdcEcra之前,先验证ecra记录及关联的Cor_Ecra是否存在
var targetEcra = _db.ecra
    .Include(e => e.Cor_Ecra)
    .FirstOrDefault(e => e.ecra_Id == decoracao.ecra_Id);

if (targetEcra != null && targetEcra.Cor_Ecra != null)
{
    var pdcEcra = new Pdc_Ecra
    {
        PE_pdc_Id = producao.pdc_Id,
        PE_ecra_Id = decoracao.ecra_Id,
        PE_Data_hora = DateTime.Now,
        PE_Contador = 0,
        PE_Ativo = "S",
        PE_user_Id = userId,
    };

    _db.producao_ecra.Add(pdcEcra);
    if (ecraAtivar != null)
    {
        ecraAtivar.ecra_Ativa = "S";
    }

    _db.SaveChanges();
}

内容的提问来源于stack exchange,提问作者André Vieira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:14:55