EF Core 6中System.DBNull强制转换异常求助
问题分析与解决方案
异常核心原因
你遇到的「无法将'System.DBNull'转换为'System.String'」异常,主要来自两个方面:
- 关联对象未显式加载:
GetCor方法仅查询producao_ecra表,未主动加载关联的Ecra和Cor_Ecra对象,EF延迟加载时若关联数据缺失或字段为NULL,会触发类型转换异常。 - 数据完整性问题:对应
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
相关产品推荐
相关产品推荐

