InvalidCastException异常求助:无法将DBNull转换为String
问题分析与解决方案
问题根源
这个InvalidCastException并非你的控制器代码直接导致,而是EF Core从MySQL读取数据时,数据库字段类型与User实体类的属性类型不匹配,使得MySqlDataReader尝试将数据库中的非字符串类型强制转换为字符串时失败。
常见触发场景:
- 数据库字段为
INT/DATETIME/BIT类型,但User实体对应属性定义为string - 数据库字段允许
NULL,但实体属性是不可为空的string,且该字段存在NULL值
排查步骤
- 核对
User实体类与MySQLUsers表的字段类型:逐个检查属性数据类型,比如数据库id是INT,实体不能写成string;数据库create_time是DATETIME,实体要对应DateTime或DateTime? - 查看完整堆栈跟踪(你提到的附图),定位具体是哪个字段转换失败——堆栈信息通常会明确指出引发问题的属性
修复示例
假设User实体错误地将数据库INT类型的Age属性定义为string,修正如下:
public class User { // 错误写法:public string Age { get; set; } public int Age { get; set; } // 正确匹配数据库INT类型 // 其他属性同理核对修正 }
如果是可空字段问题,比如数据库Remark允许NULL,实体需改为:
public string? Remark { get; set; }
额外提示
- 无需修改
MySqlDataReader.cs,这是MySqlConnector库的源码文件,你的问题属于数据类型映射错误,与库本身无关 - 修正实体类后,确保EF Core模型与数据库结构同步(可通过迁移或手动更新数据库实现)
内容的提问来源于stack exchange,提问作者Blue Hues
相关产品推荐
相关产品推荐

