实体键¶
键充当每个实体实例的唯一标识符. EF中的大多数实体都有一个键,此键映射到关系数据库中主键的概念.(对于没有键的实体,请参阅无键实体). 实体可以有超过主键的其他键(有关详细信息,请参阅备用键).
按照约定,将名为 Id 或 Id 的属性配置为实体的主键.
class Car
{
public string Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
class Truck
{
public string TruckId { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
可以将单个属性配置为实体的主键,如下所示:
数据注释(data-annotations)
public class User { [Key] public int UserId { get; set; } public string Name { get; set; } public DateTime BrithDate {get;set;} }Fluent Api
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>(b => { b.HasKey(u => u.UserId); }); }
你还可以将多个属性配置为实体的键,这称为组合键。
注意:复合主键只能使用 Fluent API 进行配置; annotation 数据注释将不会使组合键生效,你不能使用数据批注来配置它。
如下代码:
Fluent Api
public class User { public int UserName { get; set; } public string UserClass { get; set; } public DateTime BrithDate {get;set;} } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>(b => { b.HasKey(u => new {u.UserName, u.UserClass}); }); }
CREATE TABLE DEMO.Users (
UserName INT NOT NULL,
UserClass VARCHAR (450) NOT NULL,
BrithDate TIMESTAMP NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (UserName, UserClass)
);
主键名称¶
按照约定,使用名称 PK_<type name>创建关系数据库主键。 可以按如下所示配置 primary key 约束的名称:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(b => {
b.HasKey(u => u.BlogId}).HasName("PrimaryKey_BlogId");
});
}
键类型和值¶
虽然 EF Core 支持使用任何基元类型的属性作为主键,包括 string、Guid、byte[],int ,long 和其他类型,但并非所有数据库都支持将所有类型作为键。 在某些情况下,可以自动将键值转换为支持的类型,否则应自主指定其转换。
当向上下文添加新实体时,键属性必须具有非默认值,但是有些键属性是由数据库生成。 在这种情况下,EF将尝试在为跟踪目的添加实体时生成临时值。 调用SaveChanges后,临时值将被数据库生成的值替换。
注意:如果一个键属性的值由数据库生成,并且在添加实体时指定了一个非默认值,那么EF将假设该实体已经存在于数据库中,并将尝试更新它,而不是插入一个新的。 为了避免这种情况可以关闭值自动生成或查看如何为生成的属性指定显式默认值。
备用键(Alternate Keys)¶
除了主键之外,备用键还作为每个实体实例的备用唯一标识符;它可以用作关系的目标。 当使用关系数据库时,这将映射到备用键列上唯一索引/约束的概念以及引用列的一个或多个外键约束)。
注意: 如果您只想在列上强制执行唯一性,请定义唯一索引而不是备用密钥(参见索引)。 在EF中,替代键是只读的,并且在唯一索引上提供额外的语义,因为它们可以用作外键的目标。
备用键通常在需要时自动引入,而不需要手动配置它们。 按照惯例,当您确定一个属性不是主键作为关系的目标时,会自动引入一个备用键。
了解更多¶
您可以参阅 EFCore文档 备用键