[C#] EF Core - Fluent API 1:N 관계

참조


소개

  • 일반적으로 EF Core 에는 자동으로 구성할 수 있는 충분한 규칙이 포함되어 있으므로 1:N 관계를 구성할 필요가 없습니다.
  • 그러나 쉬운 유지 관리를 위해 Fluent API 에 모든 EF 구성을 포함하기로 결정한 경우 Fluent API를 사용하여 1:N 관계를 구성할 수 있습니다.

예제

  • EF Core를 사용하면 Fluent API를 사용하여 관계를 쉽게 구성할 수 있습니다.
  • Grade Entity가 많은 Student Entity를 포함하는 다음 Student 및 Grade 클래스를 보시면 됩니다.
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int CurrentGradeId { get; set; }
    public Grade Grade { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }

    public ICollection<Student> Students { get; set; }
}
  • 아래와 같이 Context 클래스에서 OnModelCreating 메서드를 재정의하여 Fluent API를 사용하여 위 Entity에 대한 1:N 관계를 구성할 수 있습니다.
using Microsoft.EntityFrameworkCore;

namespace StudentApp.Data
{
    public class SchoolContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseNpgsql(@"Server=localhost;Database=JoBeomHee;Port=5432;User Id=JoBeomHee;Password=1234");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>()
                .HasOne<Grade>(s => s.Grade)
                .WithMany(g => g.Students)
                .HasForeignKey(s => s.CurrentGradeId);
        }

        public DbSet<Grade> Grades { get; set; }    
        public DbSet<Student> Students { get; set; }
    }
}
  • 위 예에서 다음 코드는 1:N 관계를 구성합니다.
modelBuilder.Entity<Student>()
            .HasOne<Grade>(s => s.Grade)
            .WithMany(g => g.Students)
            .HasForeignKey(s => s.CurrentGradeId);
  • 이제 데이터베이스에 반영하기 위해 마이그레이션 명령인 Add-Migration update-database 를 실행합니다.
  • 마이그레이션이 정상적으로 실행 되었다면, 데이터베이스에는 아래와 같이 1:N 관계가 있는 2개의 Student, Grade 테이블이 생성된 것을 확인할 수 있습니다.


코드 관계 해석

  • 첫째로, Student 또는 Grade 중 하나의 Entity Class로 구성을 시작해야 합니다.
  • 따라서 modelBuilder.Entity<student>() 는 Student Entity로 시작합니다.
  • 두 번째로, .HasOne<Grade>(s => s.Grade) 는 Student Entity에 Grade라는 Grade 유형 속성이 포함 되도록 지정합니다.
  • 세 번째로, 관계의 다른 쪽 끝인 Grade 엔티티를 구성해야 합니다.
  • .WithMany(g => g.Stduents) 는 Grade Entity 클래스에 많은 Student Entity가 포함되도록 지정합니다.
  • 여기서 WithMany는 컬렉션 탐색 속성을 유추합니다.
  • .HasForeignKey<int>(s => s.CurrentGradeId); 외래 키 속성 CurrentGradeId의 이름을 지정합니다.
  • 외래키 지정은 선택사항 입니다. 종속 클래스에 외래 키 Id 속성이 있는 경우에만 사용합니다.

728x90

'C#' 카테고리의 다른 글

[C#] EF Core - Fluent API 1:1 관계  (0) 2023.03.18
[C#] EF Core 첫 번째 어플리케이션  (0) 2023.03.15
[C#] Entity Framework Core 란  (1) 2023.03.14
[C#] EF Core CRUD  (0) 2023.03.13
[C#] EF Core - DbContext  (0) 2023.03.11

이 글을 공유하기

댓글

Designed by JB FACTORY