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 禁用预处理器指令)。
我有以下 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 禁用预处理器指令)。