EntityTypeBuilder.HasOne.WithOne 中可能的空引用返回

Posted

技术标签:

【中文标题】EntityTypeBuilder.HasOne.WithOne 中可能的空引用返回【英文标题】:Possible null reference return in EntityTypeBuilder.HasOne.WithOne 【发布时间】:2021-12-27 23:43:33 【问题描述】:

我正在查看我参与项目之前的代码,清理启用 Nullable 注释和警告的空引用问题。

在一个地方,我们有一个自引用实体类型,它可能有也可能没有相同类型的父母和孩子;关联的属性显然已设置为可为空。

编译器警告Possible null reference return 在定义父引用或子引用时发挥作用:

entity.HasOne(d => d.Parent)
  .WithOne(p => p.Child)

Child 被标记为Possible null reference return 警告(而p 被标记为Dereference of a possibly null reference)。

我知道我可以用p.Child! 隐藏警告((p == null ? null : p.Child)! 负责取消引用),但这对我来说感觉有点不对劲。我担心它会导致 Linq 问题或其他一些我可能不会考虑寻找的问题,直到它在某个地方发生故障。

是否有更好或首选的方法来处理这个问题,或者三元方法可以吗?

【问题讨论】:

【参考方案1】:

根据实体框架documentation,处理此问题的首选方法是将第一个! 移动到.Has 函数:

entity.HasOne(d => d.Parent!)
  .WithOne(p => p.Child!)

或通过 Fluent API 或数据注释使属性不可为空并配置为可选:

class Child

  [Optional]        // <--- Either this way
  public virtual Parent Parent  get; set;  // No "!"

entity.HasOne(d => d.Parent)
  .WithOne(p => p.Child)     // Likewise for the Child within the Parent
  .IsRequired(false)    // <--- Or this way

.Has 函数中用! 标记属性如果在您自己的代码中经常访问属性会更安全,而如果属性主要在 EF Core 中使用,则依靠配置来表达可选性可能会更简洁查询。

【讨论】:

以上是关于EntityTypeBuilder.HasOne.WithOne 中可能的空引用返回的主要内容,如果未能解决你的问题,请参考以下文章