2016-09-16 24 views
0

当使用实体框架,你可以定义你的实体类为非null INT /长主键的副作用:什么是使主键可为空号与非空的

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

你也可以将主键定义为可空int:

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

我想知道这两个选项各有哪些优缺点?另外,如果我使用第二个选项,我应该使用[Required]属性注释Id

+3

主键不应该为空,否则**它不是主键** – stuartd

+0

您可以获得重复的主键 – feeeper

+0

在启动时不应该抱怨EF?我不以任何方式影响EF ... –

回答

1

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

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

2

如果您希望将您的密钥设置为NULL并取得联系,请将您的密钥设置为唯一密钥。 PRIMARY键不能为空。像

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

什么我不知道做一个主键为NULL的优点,但至于利弊而言,唯一的一点是,如果你将一个主键为可为空,然后它不再一个主键。主键使规范化数据库可引用。