处理 Net 6 的可空和 Entity Framework 实体

Deal with in Net 6's nullable and Entity Framework entities

使用 Net 6 和 Entity Framework 我有以下实体:

public class Address {

  public Int32 Id { get; set; }
  public String CountryCode { get; set; }  
  public String Locality { get; set; }
  public Point Location { get; set; }

  public virtual Country Country { get; set; }
  public virtual ICollection<User> Users { get; set; } = new List<User>();  

}

在项目定义中使用 <Nullable>enable</Nullable> 我收到警告:

Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. 

在地址属性中:

CountryCode, Locality, Location and Country.

我看到了几个处理这个问题的选项:

public String? CountryCode { get; set; } 

public String CountryCode { get; set; } = null!; 

我也可以添加构造函数,但并非所有属性(例如,导航属性)都可以在构造函数中。

最好的方法是什么?

几天前我遇到了同样的事情,实际上 .net 5 中也有可为 null 的引用类型,但我们必须手动将其添加到 .csproj 中,而对于 .net 6,它默认存在。

我采取了以下方法。

如果我知道我的 属性 是不可为 null 的,并且当迁移生成时它应该为 nullable false 那么我就这样说。

public string CountryCode { get; set;} = null!; // This indicate that this property will have value eventually. so no warning generate during compilation.

当我知道 属性 可以在数据库或迁移中包含 null 和 nullable = true 时

public string? CountryCode {get;set;}

就个人而言,我只是将这一行放在我所有模型文件(POCO/JSON 模型、DbContext 等)的顶部:

#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.

只需将该行放在文件顶部即可,无需 restore

还有一个"official" solution但是太可怕了:

public Product Product { get; set; } = null!;

无论如何,文档确实列出了我的解决方案也是有效的,但您不需要为每个 属性.

重复它

关于如何使用 VS 创建该行的提示:

你会得到这样的结果:

#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
    public TestContext(DbContextOptions options) : base(options)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.

删除最后一行并将第一行剪切到文件的顶部。