다음을 통해 공유


매핑 특성 사용(데이터 주석이라고도 함)

매핑 특성은 모델 빌드 규칙에서 검색된 구성을 수정하거나 재정의하는 데 사용됩니다. 매핑 특성에 의해 수행되는 구성은 OnModelCreating에서 사용되는 모델 빌드 API를 자체적으로 재정의할 수 있습니다.

Important

이 문서에서는 관계 구성 컨텍스트의 매핑 특성만 다룹니다. 매핑 특성의 다른 용도는 더 폭넓은 모델링 설명서의 관련 섹션에서 다룹니다.

아래 코드는 MappingAttributes.cs에서 찾을 수 있습니다.

매핑 특성을 가져올 위치

많은 매핑 특성은 System.ComponentModel.DataAnnotationsSystem.ComponentModel.DataAnnotations.Schema 네임스페이스에서 제공됩니다. 이러한 네임스페이스의 특성은 지원되는 모든 .NET 버전에서 기본 프레임워크의 일부로 포함되므로 추가 NuGet 패키지를 설치할 필요가 없습니다. 이러한 매핑 특성은 일반적으로 "데이터 주석"이라고 하며 EF Core, EF6, ASP.NET Core MVC 등을 비롯한 다양한 프레임워크에서 사용됩니다. 유효성 검사에도 사용됩니다.

여러 기술에서 데이터 주석을 사용하고 매핑 및 유효성 검사 모두에 데이터 주석을 사용하면 기술 간에 의미 체계가 달라집니다. 이제 EF Core용으로 설계된 모든 새 매핑 특성이 EF Core에만 적용되어 의미 체계를 유지하고 간단하고 명확한 특성을 사용합니다. 이러한 특성은 Microsoft.EntityFrameworkCore.Abstractions NuGet 패키지에 포함됩니다. 이 패키지는 기본 Microsoft.EntityFrameworkCore 패키지 또는 연결된 데이터베이스 공급자 패키지 중 하나가 사용될 때마다 종속성으로 포함됩니다. 그러나 추상화 패키지는 모든 EF Core 및 해당 종속성을 가져오지 않고 애플리케이션 코드에서 직접 참조할 수 있는 경량 패키지입니다.

RequiredAttribute

RequiredAttribute는 속성이 null일 수 없음을 나타내기 위해 속성에 적용됩니다. 관계의 컨텍스트에서 [Required]는 일반적으로 외래 키 속성에 사용됩니다. 이렇게 하면 외래 키가 null을 허용하지 않으므로 관계가 필요합니다. 예를 들어 다음 형식을 사용하면 Post.BlogId 속성이 null을 허용하지 않으며 관계가 필요합니다.

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [Required]
    public string BlogId { get; set; }

    public Blog Blog { get; init; }
}

참고 항목

C# null 허용 참조 형식을 사용하는 경우 이 예제의 BlogId 속성은 이미 null을 허용하지 않습니다. 즉, [Required] 특성은 아무런 영향을 주지 않습니다.

종속 탐색에 배치된 [Required]는 동일한 효과가 있습니다. 즉, 외래 키가 null을 허용하지 않도록 하여 관계가 필요합니다. 예시:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    public string BlogId { get; set; }

    [Required]
    public Blog Blog { get; init; }
}

종속 탐색에서 [Required]가 발견되고 외래 키 속성이 섀도 상태에 있는 경우 섀도 속성은 null을 허용하지 않도록 만들어 관계가 필요합니다. 예시:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [Required]
    public Blog Blog { get; init; }
}

참고 항목

관계의 주 탐색 쪽에서 [Required]를 사용하는 것은 효과가 없습니다.

ForeignKeyAttribute

ForeignKeyAttribute는 외래 키 속성을 탐색과 연결하는 데 사용됩니다. [ForeignKey]는 종속 탐색의 이름과 함께 외래 키 속성에 배치할 수 있습니다. 예시:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [ForeignKey(nameof(Blog))]
    public string BlogKey { get; set; }

    public Blog Blog { get; init; }
}

또는 [ForeignKey]는 외래 키로 사용할 속성의 이름과 함께 종속 탐색 또는 보안 주체 탐색에 배치할 수 있습니다. 예시:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    public string BlogKey { get; set; }

    [ForeignKey(nameof(BlogKey))]
    public Blog Blog { get; init; }
}

[ForeignKey]가 탐색에 배치되고 제공된 이름이 속성 이름과 일치하지 않으면 외래 키 역할을 하도록 해당 이름의 섀도 속성이 만들어집니다. 예시:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [ForeignKey("BlogKey")]
    public Blog Blog { get; init; }
}

InversePropertyAttribute

InversePropertyAttribute는 탐색과 그 역을 연결하는 데 사용됩니다. 예를 들어 다음 엔터티 형식에는 BlogPost 간에 두 가지 관계가 있습니다. 구성이 없으면 EF 규칙은 두 형식의 탐색 중 어떤 것을 쌍으로 연결할지 결정할 수 없습니다. 쌍을 이루는 탐색 중 하나에 [InverseProperty]를 추가하면 이러한 모호성이 해결되고 EF에서 모델을 빌드할 수 있습니다.

public class Blog
{
    public int Id { get; set; }

    [InverseProperty("Blog")]
    public List<Post> Posts { get; } = new();

    public int FeaturedPostId { get; set; }
    public Post FeaturedPost { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; }

    public Blog Blog { get; init; }
}

Important

[InverseProperty]는 동일한 형식 간에 둘 이상의 관계가 있는 경우에만 필요합니다. 단일 관계를 사용하면 두 탐색이 자동으로 쌍으로 연결됩니다.

DeleteBehaviorAttribute

규칙에 따라, EF는 선택적 관계에 ClientSetNull DeleteBehavior를 사용하고 필요한 관계에 Cascade 동작을 사용합니다. 관계의 탐색 중 하나에 DeleteBehaviorAttribute를 배치하여 변경할 수 있습니다. 예시:

public class Blog
{
    public int Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; }

    [DeleteBehavior(DeleteBehavior.Restrict)]
    public Blog Blog { get; init; }
}

연계 동작에 대한 자세한 내용은 계단식 삭제를 참조하세요.