使主键可空与不可空的副作用是什么?

本文关键字:副作用 是什么 | 更新日期: 2023-09-27 18:07:12

当使用实体框架时,你可以为实体类定义一个非空的主键int/long:

class Car
{
    public int Id {get; set;}
}

还可以将主键定义为可空的int:

class Car
{
     public int? Id {get; set;}
}

我想知道这两个选项的优缺点是什么?此外,如果我使用第二个选项,我应该用[Required]属性注释Id吗?

使主键可空与不可空的副作用是什么?

如果你想让你的键为NULL和唯一,那么让你的键为UNIQUE键。主键不能为空。就像

[Index("IX_MyKey", 1, IsUnique = true)]
public int Id { get; set; }

我不确定使主键为NULL的优点,但就缺点而言,唯一的事情是,如果您将使主键为NULLable,那么它不再是主键。主键使规范化数据库可被引用。

主键总是不可空的。此外,它们是不可变的(至少EF不允许您为现有对象修改它们)。

使用这两种选择中的任何一种几乎没有利弊。但是第一个(使用非空类型)看起来更自然,因为它匹配数据库列的空性。然而,即使由于某种原因您使用第二个选项,也不需要使用Required属性或IsRequired()流畅配置,因为一旦EF知道它是主键(或主键的一部分),它将使相应的数据库列不可空。