为何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从数据库读取数据时:
- 对于
public string KeyNumYear { get; set; },EF Core会认为该属性不允许为null,但数据库对应列是可空的int类型,当返回null值时,EF Core尝试将null赋值给预期非空的string属性,直接触发SqlNullValueException——因为它判定这违反了非空约束。 - 改为
public string? KeyNumYear { get; set; }后,EF Core明确知晓该属性可以接受null,因此会正常处理数据库返回的null值,不会抛出异常。
额外注意:类型映射的隐含问题
你的数据库列是可空int类型,但模型用string属性映射,EF Core会自动处理int到string的转换。但如果属性是string(非可空),当数据库返回null时,转换逻辑会因非空约束失败;标记为string?后,转换逻辑会接受null,自然不会报错。
内容的提问来源于stack exchange,提问作者Robin Sun
相关产品推荐
相关产品推荐

