数据库生成(DatabaseGeneratedOption.Identity)与密钥

DatabaseGenerated(DatabaseGeneratedOption.Identity) vs Key

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

的示例

我没能找到关于两者比较的描述。

有人可以告诉我 when/if 我想用一个代替另一个吗?

一个指定一个明确的 主键 ,另一个指定它应该是该数据库中的一个身份字段(这取决于提供者)。在很多情况下,Key 将是一个身份字段。

DatabaseGeneratedOption.Identity

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

请注意,数据库生成身份 属性 值的方式取决于数据库提供商。它可以是标识、行版本或 GUID。 SQL 服务器为整数 属性 创建标识列。

The Key Attribute

The Key attribute can be applied to a property in an entity class to make it a key property and the corresponding column to a PrimaryKey column in the database. The default convention creates a primary key column for a property whose name is Id or Id. The Key attribute overrides this default convention.

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

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

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

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

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

  • 插入一个主键但几乎不是标识列的行 始终指定查询中的值(不是由 数据库)。

简而言之,您可以将标识列想象成类似于 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; }

}

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