跳至主要內容

Key

Entity大约 2 分钟

Key

备用键和复合键

在EF Core中,备用键复合键有着特殊的含义和用途。

备用键

  • 除了主键之外,备用键也能唯一标识一条数据(跟主键一样具有唯一约束)。备用键可以用作外键关系的目标¹。
  • 当使用关系数据库时,系统通常会在需要时默认你引入备用键,你无需手动配置它们,当然也可以手动配置¹。
  • 在EF中,备用键是只读的,并且在唯一索引上提供额外的语义,因为它们可以用作外键的目标。

复合键

  • 复合键是由多个字段组成的键,这些字段一起唯一标识记录。在EF Core中,你可以使用HasIndex方法创建复合索引¹。
  • 例如,你可以创建一个由FirstNameLastName字段组成的复合索引,如下所示:
modelBuilder.Entity<Person>()
    .HasIndex(p => new { p.FirstName, p.LastName }); //创建多个列的索引

Generic

在EF Core中,DatabaseGenerated特性用于指定数据库如何为属性生成值。这个特性接受一个DatabaseGeneratedOption枚举值,该枚举有以下三个值:

  • DatabaseGeneratedOption.None:此选项指定属性的值不会由底层数据库生成。这对于覆盖id属性的默认约定很有用。例如,如果你想为id属性提供自己的值,而不是数据库生成的值,可以使用None选项。例如:
public class Course  
{  
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CourseId { get; set; } 
    public string CourseName { get; set; } 
}

在上面的例子中,EF将在数据库中创建CourseId列,并且不会将其标记为IDENTITY列。所以,每次在调用SaveChanges()方法之前,你都必须提供CourseId属性的值。

  • DatabaseGeneratedOption.Identity:你可以使用DatabaseGeneratedOption.Identity选项将非键(非id)属性标记为DB生成的属性。这指定了在INSERT语句上由数据库生成属性的值。这个Identity属性不能被更新。例如:
public class Course  
{ 
    public int CourseId { get; set; } 
    public string CourseName { get; set; }   
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int RecordNum { get; set; } 
}
  • DatabaseGeneratedOption.Computed:你可以将属性配置为在添加或更新时生成其值。例如:
public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastUpdated { get; set; } 
}
class key{
/// <summary>
/// 创建时间
/// </summary>
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreateTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime UpdateTime { get; set; }
}