当使用实体框架,你可以定义你的实体类为非null INT /长主键的副作用:什么是使主键可为空号与非空的
class Car
{
public int Id {get; set;}
}
你也可以将主键定义为可空int:
class Car
{
public int? Id {get; set;}
}
我想知道这两个选项各有哪些优缺点?另外,如果我使用第二个选项,我应该使用[Required]
属性注释Id
?
当使用实体框架,你可以定义你的实体类为非null INT /长主键的副作用:什么是使主键可为空号与非空的
class Car
{
public int Id {get; set;}
}
你也可以将主键定义为可空int:
class Car
{
public int? Id {get; set;}
}
我想知道这两个选项各有哪些优缺点?另外,如果我使用第二个选项,我应该使用[Required]
属性注释Id
?
主键总是不可空的。它们也是不可变的(至少EF不允许你为现有对象修改它们)。
几乎没有使用这两个选项中的任何一个的优点/缺点。但是第一个(使用非空类型)看起来更自然,因为它匹配数据库列的可空性。但是,即使由于某种原因使用了第二个选项,也不需要使用Required
属性或IsRequired()
流畅配置,因为一旦EF知道它是主键(或主键的一部分),它将使相应的数据库列不可为空。
如果您希望将您的密钥设置为NULL并取得联系,请将您的密钥设置为唯一密钥。 PRIMARY键不能为空。像
[Index("IX_MyKey", 1, IsUnique = true)]
public int Id { get; set; }
什么我不知道做一个主键为NULL的优点,但至于利弊而言,唯一的一点是,如果你将一个主键为可为空,然后它不再一个主键。主键使规范化数据库可引用。
主键不应该为空,否则**它不是主键** – stuartd
您可以获得重复的主键 – feeeper
在启动时不应该抱怨EF?我不以任何方式影响EF ... –