【问题标题】:Should navigation property be nullable or not导航属性是否可以为空
【发布时间】:2022-12-05 07:04:11
【问题描述】:

看看这个实体:

class EntityA
{
   public int Id { get;set; }
   public string Name { get;set; }
   public int? ClientId { get; set; }

   // Navigation properties:
   public ClientEntity? Client { get; set; }
}

如您所见,该实体包含一个可选属性:ClientId。这意味着客户端是可选的。在这种情况下,ClientId 字段在 sql server 数据库中将包含 NULL。

我正在使用外键的导航属性:这是“客户端”属性。当 ClientId 为 null 时,Client 也应该为 null。

这就是为什么我声明:“ClientEntity?”为 Client 属性键入。

但我看到有人在同样的情况下声明“ClientEntity”(不可为空)。 但我不明白他们如何在这种情况下操纵空客户端......

任何想法 ?

谢谢

【问题讨论】:

  • 想象一下没有启用“可空引用类型”的项目——这就是你所看到的。如果它适合你 - 继续。
  • 我想了解:我已尝试禁用“可为空的引用类型”并且它可以正常工作:我可以将 null 放入不可为空的对象中。这怎么可能 ?谢谢
  • 不是 EF Core 及其约定的超级专家。但可能是因为 FK ClientId 可以为空。

标签: entity-framework linq


【解决方案1】:

将此留给在为项目启用可空性时也遇到此问题的任何人,导航属性不应为可空。

根据微软,

包含对多个相关实体的引用的集合导航应始终不可为空。空集合意味着不存在相关实体,但列表本身永远不应该为空。

https://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types

所以编码的解决方案是:

class EntityA
{
   public int Id { get;set; }
   public string Name { get;set; }
   public int ClientId { get; set; }

   // Navigation properties:
   public ClientEntity Client { get; set; } = null!;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多