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

.NET Core 6中DbContext的DbSet非空但调用数据时报错

解决.NET Core 6中DbContext访问SQL Server视图的类型不匹配异常

核心排查方向

  • 核对实体与视图的字段类型映射
    堆栈指向SqlBuffer.get_Int32(),大概率是实体类属性类型和视图返回的字段类型不匹配:

    • 检查视图里的字段类型:比如视图返回bigint,实体类写成int;或者字段允许NULL,实体类用了非可空值类型(比如int而非int?)。
    • 举个例子:如果视图中AccountId是bigint,实体类定义成public int AccountId { get; set; }就会触发异常,改成public long AccountId { get; set; }即可;如果字段可能为空,要改成可空类型public int? AccountId { get; set; }。
  • 确认字段名称匹配
    EF Core默认按名称匹配字段和属性,要是名称不对应,要么改实体属性名,要么在OnModelCreating里手动配置映射:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>()
            .ToView("vwAccounts")
            .Property(a => a.EntityPropertyName)
            .HasColumnName("ViewColumnName");
    }
    
  • 查看实际执行的SQL
    在appsettings.json里开启EF Core的SQL日志,看看实际执行的语句:

    "Logging": {
        "LogLevel": {
            "Microsoft.EntityFrameworkCore.Database.Command": "Information"
        }
    }
    

    把这条SQL拿到SSMS里跑一遍,检查结果集里有没有不符合实体类型的数据——比如某条记录的数值超出int范围,或者存在NULL值但实体类用了不可空类型。

  • 处理未映射的字段
    要么确保实体类包含视图返回的所有字段,要么在OnModelCreating里显式忽略不需要的字段:

    modelBuilder.Entity<Account>()
        .Ignore(a => a.UnmappedProperty);
    

容易踩的坑

  • 视图里用CAST/CONVERT转类型时,要保证转换后的类型和实体类完全一致,比如CAST(SomeColumn AS INT)如果实际数据超出int范围,要么SQL层面报错,要么EF Core读取时触发类型不匹配。
  • SQL Server的bit类型对应EF Core的bool,别写成int。

内容的提问来源于stack exchange,提问作者Uuuuuumm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:21:37