数据库生成(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 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 属性表示它是主键。
首先查看代码,我看到一些使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
表示主键的示例,以及其他使用 [Key]
.
我没能找到关于两者比较的描述。
有人可以告诉我 when/if 我想用一个代替另一个吗?
一个指定一个明确的 主键 ,另一个指定它应该是该数据库中的一个身份字段(这取决于提供者)。在很多情况下,Key 将是一个身份字段。
DatabaseGeneratedOption.Identity
您可以使用 DatabaseGeneratedOption.Identity 选项将非键(非 ID)属性标记为数据库生成的属性。这指定 属性 的值将由数据库在 INSERT 语句上生成。此身份 属性 无法更新。
请注意,数据库生成身份 属性 值的方式取决于数据库提供商。它可以是标识、行版本或 GUID。 SQL 服务器为整数 属性 创建标识列。
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 属性表示它是主键。