.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
相关产品推荐
相关产品推荐

