관계 소개

이 문서에서는 EF Core가 둘 사이에 매핑되는 방법을 포함하여 개체 모델 및 관계형 데이터베이스의 관계 표현을 간단히 소개합니다.

개체 모델의 관계

관계는 두 엔터티가 서로 어떻게 관련되는지 정의합니다. 예를 들어 블로그에서 게시물을 모델링할 때 각 게시물은 게시된 블로그와 관련이 있으며 블로그는 해당 블로그에 게시된 모든 게시물과 관련이 있습니다.

C#과 같은 개체 지향 언어에서 블로그와 게시물은 일반적으로 Blog 및 Post라는 두 개의 클래스로 표시됩니다. 예시:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }
}
public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }
}

위의 클래스에서는 Blog 및 Post가 관련이 있음을 나타내는 것은 없습니다. Post에서 게시된 Blog로의 참조를 추가하여 개체 모델에 추가할 수 있습니다.

public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateOnly PublishedOn { get; set; }
    public bool Archived { get; set; }

    public Blog Blog { get; set; }
}

마찬가지로 동일한 관계의 반대 방향은 각 Post의 Blog 개체의 컬렉션으로 나타낼 수 있습니다.

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}

Blog에서 Post로, 반대로 Post에서 Blog로의 이 연결은 EF Core에서 "관계"라고 합니다.

중요

단일 관계는 일반적으로 어느 방향으로든 트래버스할 수 있습니다. 이 예제에서는 Blog 속성을 통해 Post에서 Blog.Posts로, Post 속성을 통해 Blog에서 Post.Blog로입니다. 이것은 두 가지가 아닌 하나의 관계입니다.

팁

EF Core에서 Blog.Posts 및 Post.Blog 속성을 "탐색"이라고 합니다.

관계형 데이터베이스의 관계

관계형 데이터베이스는 외래 키를 사용하여 관계를 나타냅니다. 예를 들어 SQL Server 또는 Azure SQL을 사용하여 다음 테이블을 사용하여 Post 및 Blog 클래스를 나타낼 수 있습니다.

CREATE TABLE [Posts] (
    [Id] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [PublishedOn] datetime2 NOT NULL,
    [Archived] bit NOT NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE);

CREATE TABLE [Blogs] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [SiteUri] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));

이 관계형 모델에서 Posts 및 Blogs 테이블에는 각각 "기본 키" 열이 제공됩니다. 기본 키의 값은 각 게시물 또는 블로그를 고유하게 식별합니다. 또한 Posts 테이블에는 "외래 키" 열이 제공됩니다. Blogs 기본 키 열 Id는 BlogId 테이블의 Posts 외래 키 열에서 참조됩니다. 이 열은 "제한"되므로 BlogId의 Posts열의 모든 값이 의 Id 열의 값과 일치해야 Blogs. 이 매칭 과정은 각 게시물이 관련된 블로그를 결정합니다. 예를 들어 BlogId 테이블의 한 행에 있는 Posts 값이 7이면 해당 행이 나타내는 게시물이 기본 키 7과 함께 블로그에 게시됩니다.

EF Core의 매핑 관계

EF Core 관계 매핑은 관계형 데이터베이스에 사용되는 기본 키/외래 키 표현을 개체 모델에 사용되는 개체 간의 참조에 매핑하는 것입니다.

가장 기본적인 의미에서 다음이 포함됩니다.

  • 각 엔터티 형식에 기본 키 속성 추가
  • 하나의 엔터티 형식에 외래 키 속성을 추가합니다.
  • 엔터티 형식 간의 참조를 기본 키와 외래 키와 연결하여 단일 관계 구성을 형성합니다.

이 매핑이 수행되면 EF는 개체 간의 참조가 변경될 때 필요에 따라 외래 키 값을 변경하고 외래 키 값이 변경될 때 필요에 따라 개체 간의 참조를 변경합니다.

참고

기본 키는 매핑 관계 이상에 사용됩니다. 자세한 내용은 키를 참조하세요.

예를 들어 위에 표시된 엔터티 형식은 기본 및 외래 키 속성으로 업데이트할 수 있습니다.

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}
public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

팁

기본 및 외래 키 속성은 엔터티 형식의 공개적으로 볼 수 있는 속성일 필요가 없습니다. 그러나 속성이 숨겨져 있더라도 EF 모델에 여전히 존재한다는 것을 인식하는 것이 중요합니다.

Blog, Blog.Id 및 Post, Post.BlogId의 외래 키 속성의 기본 키 속성은 엔터티 형식(Blog.Posts 및 Post.Blog) 간의 참조("탐색")와 연결할 수 있습니다. 이 작업은 EF에서 이와 같은 간단한 관계를 빌드할 때 자동으로 수행되지만 OnModelCreating의 DbContext 메서드를 재정의할 때 명시적으로 지정할 수도 있습니다. 예시:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasMany(e => e.Posts)
        .WithOne(e => e.Blog)
        .HasForeignKey(e => e.BlogId)
        .HasPrincipalKey(e => e.Id);
}

이제 이러한 모든 속성은 Blog 및 Post 간의 단일 관계를 나타내는 것으로 일관적으로 작동합니다.

자세히 알아보기

EF는 다양한 유형의 관계를 지원하며, 이러한 관계를 나타내고 구성할 수 있는 다양한 방법이 있습니다. 다양한 종류의 관계에 대한 예제로 이동하려면 다음을 참조하세요.

  • 단일 엔터티가 여러 다른 엔터티와 연결된 일대다 관계.
  • 단일 엔터티가 다른 단일 엔터티와 연결된 일대일 관계.
  • 여러 개의 엔터티가 여러 개의 다른 엔터티와 연결된 다대다 관계.

EF를 처음으로 사용하는 경우 위의 글머리 기호에 연결된 예제를 사용해 보면 관계가 작동하는 방식을 파악할 수 있습니다.

관계 매핑과 관련된 엔터티 형식의 속성을 자세히 알아보려면 다음을 참조하세요.

  • 외래 키가 데이터베이스에 매핑되는 방식을 다루는 외래 키 및 주 키의 관계.
  • 관계 탐색은 외래 키 위에 탐색을 계층화하여 관계의 객체 지향적 보기를 제공하는 방법을 설명합니다.

EF 모델은 규칙, 매핑 특성 및 모델 작성기 API의 세 가지 메커니즘 조합을 사용하여 빌드됩니다. 대부분의 예제에서는 모델 빌드 API를 보여 줍니다. 다른 옵션에 대한 자세한 내용은 다음을 참조하세요.

  • 엔터티 형식, 해당 속성 및 형식 간의 관계를 검색하는 관계 규칙.
  • 관계 구성의 일부 측면에 대한 모델 빌드 API 대신 사용할 수 있는 관계 매핑 특성.

중요

모델 빌드 API는 EF 모델의 최종 기준입니다. 이는 항상 규칙에 의해 발견되거나 매핑 특성에 의해 지정된 구성보다 우선합니다. 또한 EF 모델의 모든 측면을 구성하는 데 완전한 충실도를 갖춘 유일한 메커니즘이기도 합니다.

관계와 관련된 다른 항목은 다음과 같습니다.

  • 캐스케이드 삭제는 또는 가 호출될 때 관련 엔터티들이 자동으로 삭제되는 방식에 대해 설명합니다.
  • 여기서 설명한 "정상" 관계보다 두 형식 간의 연결이 더 강력하다는 것을 의미하는 특수한 유형의 "소유" 관계를 사용하는 소유 엔터티 형식. 정상적인 관계에 대해 여기에 설명된 많은 개념은 소유 관계로 이월됩니다. 그러나 소유된 관계에는 고유한 특별한 동작도 있습니다.

팁

사용된 용어를 이해하는 데 도움이 되도록 설명서를 읽을 때 필요에 따라 관계 용어 용어집을 참조하세요.

관계 활용

모델에 정의된 관계는 다양한 방법으로 사용할 수 있습니다. 예시: