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

为何Entity Framework Core 8.0中需将对应可空列的string属性声明为string?

问题解答

核心原因:可空引用类型(Nullable Reference Types)的约束

在.NET 6及以上版本(包括你使用的EF Core 8),项目默认启用了**可空引用类型(NRT)**特性。这个特性重构了C#对引用类型的处理逻辑:

  • 未加?的string会被编译器和EF Core判定为非可空引用类型,意味着代码逻辑预期该属性永远不会为null。
  • 加?的string?则明确标记为可空引用类型,允许属性值为null。

EF Core的行为差异

当EF Core从数据库读取数据时:

  1. 对于public string KeyNumYear { get; set; },EF Core会认为该属性不允许为null,但数据库对应列是可空的int类型,当返回null值时,EF Core尝试将null赋值给预期非空的string属性,直接触发SqlNullValueException——因为它判定这违反了非空约束。
  2. 改为public string? KeyNumYear { get; set; }后,EF Core明确知晓该属性可以接受null,因此会正常处理数据库返回的null值,不会抛出异常。

额外注意:类型映射的隐含问题

你的数据库列是可空int类型,但模型用string属性映射,EF Core会自动处理int到string的转换。但如果属性是string(非可空),当数据库返回null时,转换逻辑会因非空约束失败;标记为string?后,转换逻辑会接受null,自然不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:13:10