관계 소개

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

개체 모델의 관계

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

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

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

위의 클래스에서는 BlogPost가 관련이 있음을 나타내는 것은 없습니다. 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; }
}

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

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에서 "관계"라고 합니다.

Important

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

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

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

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

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]));

이 관계형 모델에서 PostsBlogs 테이블에는 각각 "기본 키" 열이 제공됩니다. 기본 키의 값은 각 게시물 또는 블로그를 고유하게 식별합니다. 또한 Posts 테이블에는 "외래 키" 열이 제공됩니다. Blogs 기본 키 열 IdPosts 테이블의 BlogId 외래 키 열에서 참조됩니다. 이 열은 "제한"되므로 PostsBlogId열의 모든 값이 BlogsId 열의 값과 일치해야 합니다. 이 일치는 모든 게시물과 관련된 블로그를 결정합니다. 예를 들어 Posts 테이블의 한 행에 있는 BlogId 값이 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.IdPost, Post.BlogId의 외래 키 속성의 기본 키 속성은 엔터티 형식(Blog.PostsPost.Blog) 간의 참조("탐색")와 연결할 수 있습니다. 이 작업은 EF에서 이와 같은 간단한 관계를 빌드할 때 자동으로 수행되지만 DbContextOnModelCreating 메서드를 재정의할 때 명시적으로 지정할 수도 있습니다. 예시:

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

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

자세히 알아보기

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

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

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

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

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

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

Important

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

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

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

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

관계 사용

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