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

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字段为自增列但实体类未做对应配置,或是主键字段类型不匹配也会触发转换错误
解决方法

按照以下步骤逐一排查修复:

  1. 核对表结构与实体类的一致性
    打开SQL Server管理器查看users库下info表的字段定义:
    • 若ID字段为bigint,将实体类ID属性改为public long ID { get; set; }
    • 若ID字段允许为NULL,将实体类ID属性改为public int? ID { get; set; }(或对应可空值类型)
    • 确认Name字段为varchar/nvarchar等字符串类型,与实体类string类型匹配
  2. 补充实体类主键配置
    给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; }
    }
    
  3. 优化查询代码定位问题
    可以在查询时显式指定需要查询的字段,避免多余字段影响映射,同时强制立即加载便于排查:
    // 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 14:54:03