SQLite 错误 19:“NOT NULL 约束失败”- 字符串在 .NET6/C# 8 中是否默认可为空?

问题描述 投票:0回答:1

我在将我的项目从 .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; }


    }
c# entity-framework .net-core migration nullable-reference-types
1个回答
4
投票

可空感知上下文

是的,在 .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?可以用 null 或初始化 分配为空,但需要在之前检查是否为空 取消引用。
  • T 类型的变量 m?申请时被认为是非空的 零容忍运算符,如 m!.

不可空引用类型T和可空引用类型T的区别?由编译器对前面规则的解释强制执行。一个T类型的变量和一个T类型的变量?由相同的 .NET 类型表示。

可空引用类型

例子:

string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness

附加信息:

学习解决可为空警告的技术

使用可空引用类型更新代码库以改进空诊断警告

© www.soinside.com 2019 - 2024. All rights reserved.