구성

키는 각 엔터티 인스턴스에 대한 고유 식별자 역할을 합니다. EF의 대부분의 엔터티에는 관계형 데이터베이스의 기본 키 개념에 매핑되는 단일 키가 있습니다(키가 없는 엔터티의 경우 키 없는 엔터티 참조). 엔터티에는 기본 키 이외의 추가 키가 있을 수 있습니다(자세한 내용은 대체 키 참조).

기본 키 구성

규칙에 따라 Id 또는 <type name>Id이는 속성이 엔터티의 기본 키로 구성됩니다.

internal class Car
{
    public string Id { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

internal class Truck
{
    public string TruckId { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

참고 항목

소유 엔터티 형식은 다른 규칙을 사용하여 키를 정의합니다.

다음과 같이 단일 속성을 엔터티의 기본 키로 구성할 수 있습니다.

internal class Car
{
    [Key]
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

여러 속성을 엔터티의 키로 구성할 수도 있습니다. 이를 복합 키라고 합니다. 규칙은 소유 형식 컬렉션과 같은 특정 경우에 복합 키만 설정합니다.

참고 항목

[PrimaryKey] 성은 EF Core 7.0에서 도입되었습니다. 이전 버전에서 Fluent API를 사용합니다.

[PrimaryKey(nameof(State), nameof(LicensePlate))]
internal class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

가치 창출

복합이 아닌 숫자 및 GUID 기본 키의 경우 EF Core는 규칙에 따라 값 생성을 설정합니다. 예를 들어 SQL Server 숫자 기본 키는 자동으로 IDENTITY 열로 설정됩니다. 자세한 내용은 값 생성에 대한 설명서특정 상속 매핑 전략에 대한 지침을 참조하세요.

기본 키 이름

규칙에 따라 관계형 데이터베이스에서 기본 키는 PK_<type name> 름으로 만들어집니다. 다음과 같이 기본 키 제약 조건의 이름을 구성할 수 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasKey(b => b.BlogId)
        .HasName("PrimaryKey_BlogId");
}

키 형식 및 값

EF Core는 기본 형식의 속성을 기본 키(예: string, Guid, byte[] 등)로 사용할 수 있지만 모든 데이터베이스가 모든 형식을 키로 지원하는 것은 아닙니다. 경우에 따라 키 값을 지원되는 형식으로 자동으로 변환할 수 있으며, 그렇지 않으면 변환을 수동으로 지정해야 합니다.

컨텍스트에 새 엔터티를 추가할 때 키 속성에는 항상 기본값이 아닌 값이 있어야 하지만 일부 형식은 데이터베이스에서 생성됩니다. 이 경우 EF는 엔터티가 추적 목적으로 추가될 때 임시 값을 생성하려고 합니다. SaveChanges를 호출한 후 임시 값은 데이터베이스에서 생성된 값으로 대체됩니다.

Important

키 속성에 데이터베이스에서 생성된 값이 있고 엔터티가 추가될 때 기본값이 아닌 값이 지정된 경우 EF는 엔터티가 데이터베이스에 이미 있다고 가정하고 새 엔터티를 삽입하는 대신 업데이트하려고 합니다. 이를 방지하려면 값 생성을 해제하거나 생성된 속성에 대해 명시적 값을 지정하는 방법을 확인합니다.

대체 키

대체 키는 기본 키 외에 각 엔터티 인스턴스에 대한 대체 고유 식별자 역할을 합니다. 관계의 대상으로 사용할 수 있습니다. 관계형 데이터베이스를 사용하는 경우 대체 키 열의 고유 인덱스/제약 조건 개념과 열을 참조하는 하나 이상의 외래 키 제약 조건에 매핑됩니다.

열에 고유성을 적용하려는 경우 대체 키가 아닌 고유 인덱스를 정의합니다(인덱스 참조). EF에서 대체 키는 읽기 전용이며 외래 키의 대상으로 사용할 수 있으므로 고유 인덱스에 대한 추가 의미 체계를 제공합니다.

대체 키는 일반적으로 필요할 때 도입되며 수동으로 구성할 필요가 없습니다. 규칙에 따라 기본 키가 아닌 속성을 관계의 대상으로 식별할 때 대체 키가 도입됩니다.

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}

단일 속성을 대체 키로 구성할 수도 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate);
}

여러 속성을 대체 키(복합 대체 키라고 함)로 구성할 수도 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => new { c.State, c.LicensePlate });
}

마지막으로 규칙에 따라 대체 키에 대해 도입된 인덱스 및 제약 조건의 이름은 AK_<type name>_<property name>으로 지정됩니다(복합 대체 키 <property name>의 경우 속성 이름의 밑줄로 구분된 목록이 됨). 대체 키의 인덱스 이름 및 고유 제약 조건을 구성할 수 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate)
        .HasName("AlternateKey_LicensePlate");
}