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 中可能的空引用返回的主要内容,如果未能解决你的问题,请参考以下文章