【问题标题】:Possible null reference return in EntityTypeBuilder.HasOne.WithOneEntityTypeBuilder.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 问题或其他一些我可能不会考虑寻找的问题,直到它在某个地方发生故障。

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

【问题讨论】:

    标签: c# entity-framework foreign-keys nullable-reference-types


    【解决方案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 中使用,则依靠配置来表达可选性可能会更简洁查询。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多