EF Core查询SQL Server数据时出现System.InvalidCastException错误
错误原因
该System.InvalidCastException异常触发在EF Core将数据库查询结果映射到info实体类的阶段,核心原因是实体类定义和数据库表结构不匹配,常见触发场景如下:
- 字段类型不匹配:
info类的ID属性声明为int,但数据库对应info表的ID字段实际为bigint、varchar、uniqueidentifier等无法直接隐式转换为int的类型;或是Name属性声明为string,但数据库对应字段为非字符串类型且无法直接转换为字符串 - 可空性不匹配:数据库
info表的ID字段允许为NULL,但实体类的ID属性为非可空值类型int,当查询到ID为NULL的行时就会触发类型转换失败 - 主键规则不匹配:EF Core默认将名为
ID的字段识别为主键,若数据库ID字段为自增列但实体类未做对应配置,或是主键字段类型不匹配也会触发转换错误
解决方法
按照以下步骤逐一排查修复:
- 核对表结构与实体类的一致性
打开SQL Server管理器查看users库下info表的字段定义:- 若
ID字段为bigint,将实体类ID属性改为public long ID { get; set; } - 若
ID字段允许为NULL,将实体类ID属性改为public int? ID { get; set; }(或对应可空值类型) - 确认
Name字段为varchar/nvarchar等字符串类型,与实体类string类型匹配
- 若
- 补充实体类主键配置
给info类的ID属性加上主键标注,明确主键生成规则:using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class info { [Key] // 如果ID是自增列则保留以下配置,若为手动指定ID则改为DatabaseGeneratedOption.None [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Name { get; set; } } - 优化查询代码定位问题
可以在查询时显式指定需要查询的字段,避免多余字段影响映射,同时强制立即加载便于排查:// GET api/values public IEnumerable<string> Get() { List<string> users_arr = new List<string>(); using (var db = new Database()) { // 显式查询指定字段,减少映射影响 var users = db.info.Select(u => new { u.ID, u.Name }).ToList(); foreach (var user in users) { users_arr.Add($"ID:{user.ID}, Name:{user.Name}"); } } return users_arr; }
内容的提问来源于stack exchange,提问作者Omar Ayoub
相关产品推荐
相关产品推荐

