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

.NET 6中Entity Framework查询触发SqlNullValueException问题求助

问题分析

这个错误的核心原因是**.NET 6默认启用了Nullable Reference Types(可空引用类型,NRT)**,对应的EF Core 6.x会严格遵循实体类的可空性配置:如果实体类中的字符串属性被定义为非可空(string),EF Core会假设数据库中该字段不存在NULL值,当读取到NULL时就会抛出SqlNullValueException。而在.NET 3.1中,NRT默认未启用,EF Core对非可空字符串字段的NULL值处理更宽松(会自动转为空字符串或忽略NULL),因此不会报错。

解决方案

1. 修正实体类的可空性配置

检查Models.TlTemplateLayout实体类中的字符串属性(比如TlJson、TlHtml),如果数据库中对应的字段允许NULL,将实体类属性改为可空类型:

// 原非可空定义
public string TlJson { get; set; }
public string TlHtml { get; set; }

// 修改为可空
public string? TlJson { get; set; }
public string? TlHtml { get; set; }

修改后EF Core会正确处理数据库中的NULL值,不会抛出异常。

2. 过滤数据库中的NULL记录

如果数据库中的NULL值是意外数据,且不需要处理这些记录,可以在查询时直接过滤掉:

List<Models.TlTemplateLayout> tl = ctx.TlTemplateLayout
    .Where(x => x.TlTctId == 11 
                && x.TlJson != null 
                && x.TlHtml != null)
    .ToList();

3. 调整EF Core的模型配置(不推荐)

如果不想修改实体类的可空性,可以在上下文的OnModelCreating方法中,为特定属性配置允许NULL:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TlTemplateLayout>()
        .Property(x => x.TlJson)
        .IsRequired(false);
        
    modelBuilder.Entity<TlTemplateLayout>()
        .Property(x => x.TlHtml)
        .IsRequired(false);
}

这种方式会绕过NRT的约束,不建议长期使用,最好还是保持实体类和数据库结构的一致性。

额外说明

从.NET 5开始,EF Core就加强了对NRT的支持,.NET 6更是将NRT设为默认启用。这种变化是为了提前暴露潜在的空引用问题,提升代码健壮性。建议优先采用修正实体类可空性的方案,从根源上解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:21