处理 Net 6 的可为空和实体框架实体 [关闭]

Posted

技术标签:

【中文标题】处理 Net 6 的可为空和实体框架实体 [关闭]【英文标题】:Deal with in Net 6's nullable and Entity Framework entities [closed] 【发布时间】:2021-11-22 16:04:37 【问题描述】:

使用 Net 6 和实体框架我有以下实体:

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>();  


在项目定义中使用 &lt;Nullable&gt;enable&lt;/Nullable&gt; 我收到警告:

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!; 

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

最好的方法是什么?

【问题讨论】:

documentation 显示了一些可能性。但我同意,这不是最重要的。 【参考方案1】:

就我个人而言,我只是将这一行放在我所有模型文件(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.

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

【讨论】:

【参考方案2】:

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

我采取了以下方法。

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

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

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

public string? CountryCode get;set;

【讨论】:

我认为在使用 EF 迁移时使用“public string? CountryCode get;set;public string CountryCode get; set; = null!; 无关紧要。实体配置中的内容就是应用的内容。我错了吗? 相关。 string 导致不可为空的字段(必需),而string? 允许空值。至少对于 SQLite 和 SQL Server。 部分正确。意味着如果您明确提供设置,那很好,但如果您只添加 builder.Property(x=>x.Countrycode)。此时可为空的引用类型发挥作用,生成像可空列或不可空列一样的迁移。 @dotnetstep 好的,我在我的实体 Fluent 配置中将 Required 设置为 truefalse,因此实体的流畅配置似乎覆盖了属性是否可以为空。

以上是关于处理 Net 6 的可为空和实体框架实体 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

没有主键和可为空字段的休眠实体

实体框架中一个或多个实体的可空布尔属性验证失败

多个可为空的复合外键

实体框架中的可空实体投影

实体框架中的可选一对多关系[关闭]

必需的属性,但可以为空,通过代码优先的实体框架