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

