我在将我的项目从 .NET 5 迁移到 .NET 6 后遇到了这个问题。我正在使用最新版本的 SQLite 作为数据库。
Visual Studio 似乎假设
string
默认情况下不再可以为空。每当 Entity Framework 尝试写入不是主键或外键的字段时,我都会收到错误SQLite Error 19: 'NOT NULL constraint failed
。在 .NET 5 中,我没有收到此错误。
我还注意到 VS 2022 Intellisense 在导致此错误的每个属性名称下都有一条绿色指示线。它说
Non-nullable property must contain a non null-value when exiting constructor. Consider declaring the property as nullable.
导致错误的代码示例:
[Table("ApplicationUser")]
public class ApplicaitonUser : IdentityUser
{
// Inherited properties https://learn.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-6.0
[Key]
public new int Id { get; set; } // every other property causes the SQLite 19 error
[PersonalData]
public string FirstName { get; set; }
[PersonalData]
public string MiddleName { get; set; }
[PersonalData]
public string LastName { get; set; }
[PersonalData]
public string PreferredName { get; set; }
// Address Table Foreign Key relationship navigation property
[PersonalData]
ICollection<UsAddress> UsAddresses { get; set; }
}
是的,在 .Net 6/C#8 中,Microsoft 引入了“nullable aware context”。启用后,此上下文允许字符串需要可空指定,就像其他类型一样。这对于测试等很有用......
可以使用项目文件中的
<nullable>enable</nullable
或<nullable>disable</nullable>
属性打开和关闭此功能。由于默认情况下禁用该功能,因此也可以删除该属性以禁用它。
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
在可空感知上下文中:
不可空引用类型T和可空引用类型T的区别?由编译器对前面规则的解释强制执行。一个T类型的变量和一个T类型的变量?由相同的 .NET 类型表示。
例子:
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
附加信息: