DatabaseGenerated(DatabaseGeneratedOption.Identity)vs Key

问题描述 投票:0回答:2

[首先看代码,我看到一些使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]表示主键的示例,以及其他使用[Key]的示例。

我无法找到关于两者如何比较的描述。

有人可以告诉我何时/是否要使用另一个?

c# entity-framework .net-core ef-code-first razor-pages
2个回答
1
投票

一个指定显式主键,另一个指定它应该是该数据库中的一个标识字段(取决于提供者)。在很多情况下,密钥将是一个身份字段。

DatabaseGeneratedOption.Identity

您可以使用DatabaseGeneratedOption.Identity选项将非关键(非id)属性标记为数据库生成的属性。这指定该属性的值将由数据库在INSERT语句上生成。此身份属性无法更新。

请注意,数据库生成Identity属性值的方式取决于数据库提供程序。它可以是标识,行版本或GUID。 SQL Server为整数属性创建一个标识列。

The Key Attribute

Key属性可以应用于实体类中的属性,以使其成为键属性,并使其对应于PrimaryKey的列数据库中的列。默认约定创建一个主键名称为Id或Id的属性的列。的键属性将覆盖此默认约定。

如果您想指定非身份主键,则可以使用类似这样的东西

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

1
投票

[(和DatabaseGeneratedOption.Identity)数据库中的标识列表示该列在插入时自动生成值。这些通常是int列,并且类似,它们会自动增加。

  • 使用标识列的行的INSERT从查询中省略一个值(由数据库生成)

另一方面,仅仅因为列是主键,not表示它是一个标识列。在许多情况下,您不只是希望数据库自动为列生成一个值。以及不能作为标识列的数据类型。

  • 几乎是PK,但不是标识列的行的INSERT始终在查询中指定值(不是由查询生成的数据库)。

简而言之,您可以将标识列视为类似于GUID。它唯一地标识一行,但它本身并不是有用的数据。

与主键列“ email_address”进行对比,它肯定不是身份列。加上它是合法数据。

© www.soinside.com 2019 - 2024. All rights reserved.