DatabaseGenerated(DatabaseGeneratedOption.Identity) vs Key



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

我一直找不到关于两者比较的描述。

有人能告诉我什么时候/是否想用一个而不是另一个吗?

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

DatabaseGeneratedOption.Identity

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

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

关键属性

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

如果你想指定一个非身份主键,你可以使用类似于这个的东西

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

数据库中的标识列(和DatabaseGeneratedOption.Identity(表示该列在插入时自动生成值。这些通常是自动递增的int列和类似的列。

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

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

  • 插入一行,该行几乎是PK但不是标识列始终指定查询中的值(不是由数据库(

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

与主键列"email_address"相比,它肯定不是身份列。另外,这是合法的数据。

DatabaseGeneratedOption.Identity:

例如:

public class Car
{
[key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Model { get; set; }
public DateTime Registered { get; set; }
}

假设我有一个类名Car,我在类中有不同的属性,比如Id、Model和Registered,当你在数据库中插入数据等操作时,你不必指定Id列的值(比如1、2、100、141(,数据库会为你处理Id列。如果将自动递增设置为1,则第一条记录将以1开始,它将自动递增,如2,3,4……顶部的键属性表示它是主键。

最新更新