Entity Framework Core 版本是 8.0。这是我的模型。
public class Item
{
[Key] public long ItemId { get; set; }
public string KeyNumYear { get; set; }
...
}
在数据库中,KeyNumYear
是可空的int列。
我们有一行字段值为空KeyNumYear
。使用 EfCore 查询此行时,出现以下错误。
System.Data.SqlTypes.SqlNullValueException: “数据为 Null。无法对 Null 值调用此方法或属性。”
但如果我将其改为public string? KeyNumYear { get; set; }
,它就能成功运行。
我很困惑,因为我认为string
在 C# 中已经是可空的。为什么我必须将其标记为string?
在 Entity Framework Core 中?
理想情况下,如果数据库列是可以为空的 int,则实体中的属性应该是:
string
不起作用的原因是 EF 将检测类型转换并解释对 astring
与 a的需求string?
并需要应用转换,特别是 .ToString()
是#null.ToString()
无效的,如果声明为可空字符串,EF 将知道在应用ToString()
.之前先检查 #null。string
是引用类型,而不是明确可空类型。在 .Net Core 6 之前,引用类型默认被解释为可空。在 .Net 6 中,他们引入了显式可空引用类型。