구성Keys

키는 각 엔터티 인스턴스에 대 한 고유 식별자 역할을 합니다.A key serves as a unique identifier for each entity instance. EF의 엔터티에는 대부분 관계형 데이터베이스의 기본 키 개념에 매핑되는 단일 키가 있습니다 (키가 없는 엔터티의 경우 키가 없는 엔터티참조).Most entities in EF have a single key, which maps to the concept of a primary key in relational databases (for entities without keys, see Keyless entities). 엔터티는 기본 키 이외의 추가 키를 가질 수 있습니다 (자세한 내용은 대체 키 참조).Entities can have additional keys beyond the primary key (see Alternate Keys for more information).

규칙에 따라 또는 이라는 속성 Id<type name>Id 엔터티의 기본 키로 구성 됩니다.By convention, a property named Id or <type name>Id will be configured as the primary key of an entity.

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; }
}

참고

소유 하는 엔터티 형식은 다른 규칙을 사용 하 여 키를 정의 합니다.Owned entity types use different rules to define keys.

다음과 같이 단일 속성을 엔터티의 기본 키로 구성할 수 있습니다.You can configure a single property to be the primary key of an entity as follows:

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

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

여러 속성을 엔터티의 키로 구성할 수도 있습니다 .이를 복합 키 라고 합니다.You can also configure multiple properties to be the key of an entity - this is known as a composite key. 복합 키는 흐름 API를 사용 하 여 구성할 수 있습니다. 규칙은 복합 키를 설정 하지 않으며 데이터 주석을 사용 하 여 구성할 수 없습니다.Composite keys can only be configured using the Fluent API; conventions will never setup a composite key, and you can not use Data Annotations to configure one.

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

기본 키 이름Primary key name

규칙에 따라 관계형 데이터베이스에는 이름으로 기본 키가 생성 됩니다 PK_<type name> .By convention, on relational databases primary keys are created with the name PK_<type name>. 다음과 같이 primary key 제약 조건의 이름을 구성할 수 있습니다.You can configure the name of the primary key constraint as follows:

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

키 유형 및 값Key types and values

EF Core는, 및 기타를 포함 하 여 기본 키로 기본 형식의 속성을 사용 하는 것을 지원 하지만 string Guid byte[] 모든 데이터베이스가 키로 모든 유형을 지 원하는 것은 아닙니다.While EF Core supports using properties of any primitive type as the primary key, including string, Guid, byte[] and others, not all databases support all types as keys. 경우에 따라 키 값을 지원 되는 형식으로 자동으로 변환할 수 있습니다. 그렇지 않으면 변환을 수동으로 지정해야 합니다.In some cases the key values can be converted to a supported type automatically, otherwise the conversion should be specified manually.

컨텍스트에 새 엔터티를 추가 하는 경우 키 속성은 항상 기본값이 아닌 값을 가져야 하지만 일부 유형은 데이터베이스에 의해 생성됩니다.Key properties must always have a non-default value when adding a new entity to the context, but some types will be generated by the database. 이 경우 EF는 추적을 위해 엔터티가 추가 될 때 임시 값을 생성 하려고 시도 합니다.In that case EF will try to generate a temporary value when the entity is added for tracking purposes. SaveChanges 가 호출 되 면 임시 값이 데이터베이스에 의해 생성 된 값으로 바뀝니다.After SaveChanges is called the temporary value will be replaced by the value generated by the database.

중요

키 속성의 값이 데이터베이스에 의해 생성 되 고 엔터티가 추가 될 때 기본값이 아닌 값이 지정 된 경우 EF는 엔터티가 데이터베이스에 이미 있는 것으로 가정 하 고 새 엔터티를 삽입 하는 대신 업데이트 하려고 합니다.If a key property has its value generated by the database and a non-default value is specified when an entity is added, then EF will assume that the entity already exists in the database and will try to update it instead of inserting a new one. 이 값을 해제 하지 않으려면 생성 된 속성에 대해 명시적 값을 지정 하는 방법을 참조 하세요.To avoid this turn off value generation or see how to specify explicit values for generated properties.

대체 키Alternate Keys

대체 키는 기본 키 외에도 각 엔터티 인스턴스에 대 한 대체 고유 식별자 역할을 합니다. 이를 관계의 대상으로 사용할 수 있습니다.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key; it can be used as the target of a relationship. 관계형 데이터베이스를 사용 하는 경우이는 대체 키 열에 대 한 고유 인덱스/제약 조건 개념 및 열을 참조 하는 하나 이상의 foreign key 제약 조건에 매핑됩니다.When using a relational database this maps to the concept of a unique index/constraint on the alternate key column(s) and one or more foreign key constraints that reference the column(s).

열에 고유성을 적용 하려면 대체 키 대신 고유 인덱스를 정의 합니다 ( 인덱스참조).If you just want to enforce uniqueness on a column, define a unique index rather than an alternate key (see Indexes). EF에서 대체 키는 읽기 전용 이며 외래 키의 대상으로 사용할 수 있기 때문에 고유 인덱스에 대 한 추가 의미 체계를 제공 합니다.In EF, alternate keys are read-only and provide additional semantics over unique indexes because they can be used as the target of a foreign key.

일반적으로 필요에 따라 대체 키가 소개 되며 수동으로 구성할 필요가 없습니다.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. 규칙에 따라 기본 키가 아닌 속성을 관계의 대상으로 식별 하면 대체 키가 도입 됩니다.By convention, an alternate key is introduced for you when you identify a property which isn't the primary key as the target of a relationship.

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; }
}

또한 단일 속성을 대체 키로 구성할 수 있습니다.You can also configure a single property to be an alternate key:

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

여러 속성을 복합 대체 키로 알려진 대체 키로 구성할 수도 있습니다.You can also configure multiple properties to be an alternate key (known as a composite alternate key):

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

마지막으로, 규칙에 따라 대체 키에 대해 도입 된 인덱스 및 제약 조건의 이름이로 지정 됩니다 AK_<type name>_<property name> . 복합 대체 키의 경우 <property name> 속성 이름의 밑줄로 구분 된 목록이 됩니다.Finally, by convention, the index and constraint that are introduced for an alternate key will be named AK_<type name>_<property name> (for composite alternate keys <property name> becomes an underscore separated list of property names). 대체 키의 인덱스 및 unique 제약 조건의 이름을 구성할 수 있습니다.You can configure the name of the alternate key's index and unique constraint:

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