EF Core查询实体时报错Unable to cast DBNull to System.String如何解决?
报错原因
你遇到的这个错误和C#中string本身的可空性无关,核心问题出在EF Core的实体映射配置规则上:
当你通过IsRequired()显式标记string类型字段为必填时,EF Core会在内部将该字段标记为「非空映射」,查询阶段会直接跳过DBNull到null的兼容转换逻辑——因为EF默认该字段在数据库中不可能返回空值,会直接将读取到的数据库值强转为string,碰到数据库实际存储的NULL时就会抛出InvalidCastException。
写入未报错的原因
写入阶段没有触发问题通常是两种场景导致的:
- 你写入数据时该字段都携带有效值,EF的必填校验不会触发,但后续可能有其他操作(比如直接修改数据库、其他未使用同一份EF配置的服务写入数据)给该字段插入了
NULL值 - 你配置
IsRequired()之后没有执行EF迁移同步修改数据库表结构,数据库层面该字段仍允许NULL,只有EF层面做了非空校验,写入时只要传入的字段值不为空就不会触发校验,只有读取时碰到数据库已有的NULL才会报错。
修复方案
- 如果该字段业务上确实允许为空,直接移除实体配置中对应字段的
IsRequired()调用即可,EF会自动完成DBNull到string类型null的转换 - 如果该字段业务上要求必填,先将数据库中现有该字段为
NULL的记录补填默认值,再执行EF迁移将数据库表对应字段修改为非空约束,避免后续再出现非法NULL值写入。
内容的提问来源于stack exchange,提问作者lenny
相关产品推荐
相关产品推荐

