linq 查询中导航 属性 上的可空引用警告

Nullable reference warning on navigation property in linq query

我有以下 class(仅包括相关字段)映射到数据库 table:

public class Report {
  public int? LocationClassificationID { get; set; }
  public virtual Lookup? LocationClassification { get; set; }
}

映射如下

        e.HasOne(x => x.LocationClassification).WithMany().HasForeignKey(x => x.LocationClassificationID);

我正在编写一个 linq 查询,如下所示:

    Model.Reports
        .Select(x => new {
            Field=x.LocationClassification.Text

编译器针对查询中的 LocationClassification 给出了一个可能的空引用异常,但在这种情况下,空引用不是问题,因为 linq 透明地处理了这个问题。我可以通过如下声明 class 属性 来消除警告:

  public virtual Lookup LocationClassification { get; set; } = null!;

但这对吗?文档说要使用 null!当您知道 属性 永远不会真正为空时,但在这种情况下 属性 可以为空,这在 linq 查询中并不重要,但如果我引用它可能会给出异常代码中的字段。

处理上述情况的正确方法是什么,保持 null 保护但在 linq 查询中没有警告?

您可以在查询本身中使用专为此类情况设计的 null forgiving operator

Model.Reports
    .Select(x => new
    {
        Field = x.LocationClassification!.LocationClassificationID
        ...
    });

如果您经常这样做并且不喜欢,那么您可以选择使 属性 不可为空(see the docs),但无论哪种方式都是一种权衡您需要决定什么与您更相关 - 编译时可空性检查或一些额外的代码。

此外,作为一个选项,您可以分离数据库访问层并仅针对它禁用 NRT(针对整个项目或对具有查询的文件使用#nullable 禁用预处理器指令)。