[C#] EF Core –


참조

소개

  • Entity Framework Fluent API는 규칙을 재정의하도록 도메인 클래스를 구성하는 데 사용됩니다.
  • EF Fluent API는 결과가 일련의 메서드로 공식화되는 Fluent API 디자인 패턴을 기반으로 합니다.
  • Entity Framework Core에서 ModelBuilder 클래스는 유창한 API 역할을 합니다.
  • 이를 사용하여 데이터 주석 속성보다 더 많은 구성 옵션을 제공하여 다양한 항목을 구성하고 사용할 수 있는 유연성을 제공할 수 있습니다.

Entity Framework 핵심 모델의 구성 요소

  • Entity Framework Core Fluent API는 모델의 다음 측면을 구성합니다.
    • 모델 구성: 데이터베이스 매핑을 위한 EF 모델을 구성합니다.
      매핑에서 제외할 기본 스키마, DB 기능, 추가 데이터 주석 속성 및 엔터티를 구성합니다.
    • 엔티티 구성: 엔티티를 데이터 포인트 및 관계 맵으로 구성합니다.
      PrimaryKey, AlternateKey, 인덱스, 테이블 이름, 일대일, 일대다, 다대다 관계 등
    • 속성 구성: 열 매핑에 대한 속성을 구성합니다.
      열 이름, 기본값, null 허용 여부, 외래 키, 데이터 유형, 동시성 열 등

구성 유형 정보

  • 다음 표에는 각 구성 유형에 대한 중요한 방법이 나열되어 있습니다.
구성 흐르는 API 메서드 사용
모델 구성 HasDbFunction() 관계형 데이터베이스를 대상으로 할 때 데이터베이스 기능을 구성합니다.
HasDefaultSchema() 데이터베이스 스키마를 지정합니다.
HasNote() 엔티티에 대한 데이터 주석 속성을 추가하거나 업데이트합니다.
하스시퀀스() 관계형 데이터베이스를 대상으로 할 때 데이터베이스 시퀀스를 구성합니다.
엔티티 구성 HatAlternateKey() 엔터티에 대한 EF 모델의 대체 키를 구성합니다.
HasIndex() 지정된 속성의 인덱스를 구성합니다.
하스키() 속성 또는 속성 목록을 기본 키로 구성합니다.
많이있다() 엔터티가 일대다 또는 다대다 관계에 대한 다른 유형의 참조 컬렉션 속성을 포함하는 관계의 많은 부분을 구성합니다.
하스원() 엔터티가 일대일 또는 일대다 관계에 대한 다른 유형의 참조 속성을 포함하는 관계의 한 부분을 구성합니다.
무시하려면() 클래스 또는 속성이 테이블이나 열에 매핑되지 않도록 구성합니다.
OwnsOne() 이 엔터티가 대상 엔터티를 소유하는 관계를 구성합니다.
대상 엔터티의 키 값은 속한 엔터티에서 전파됩니다.
테이블로() 엔터티가 매핑되는 데이터베이스 테이블을 구성합니다.
속성 구성 HasColumnName() 속성에 대한 데이터베이스의 해당 열 이름을 구성합니다.
HasColumnType() 속성에 대한 데이터베이스에서 해당 열의 데이터 유형을 구성합니다.
HasComputedColumnSql() 관계형 데이터베이스를 대상으로 할 때 데이터베이스의 계산 열에 매핑하도록 속성을 구성합니다.
HasDefaultValue() 관계형 데이터베이스를 대상으로 할 때 속성이 매핑되는 열의 기본값을 구성합니다.
HasDefaultValueSql() 관계형 데이터베이스를 대상으로 할 때 속성이 매핑되는 열에 대한 기본 값 식을 구성합니다.
하스필드() 속성과 함께 사용할 백업 필드를 지정합니다.
최대 길이() 속성에 저장할 수 있는 최대 데이터 길이를 구성합니다.
IsConcurrencyToken() 낙관적 동시성 토큰으로 사용할 속성을 구성합니다.
필요한() 속성의 유효한 값이 필요한지 또는 null이 유효한 값인지 여부를 구성합니다.
IsRowVersion() 낙관적 동시성 검색에 사용할 속성을 구성합니다.
유니코드() 유니코드 문자를 포함하거나 포함하지 않을 수 있는 String 속성을 구성합니다.
ValueGeneratedNever() 엔터티가 저장될 때 생성된 값을 가질 수 없는 속성을 구성합니다.
ValueGeneratedOnAdd() 새 엔터티를 저장할 때 생성된 값을 갖도록 속성을 구성합니다.
ValueGeneratedOnAddOrUpdate() 새 엔터티 또는 기존 엔터티를 저장할 때 생성된 값을 갖도록 속성을 구성합니다.
ValueGeneratedOnUpdate() 기존 엔터티를 저장할 때 생성된 값을 갖도록 속성을 구성합니다.

유체 API 구성

  • OnModelCreating 메서드를 재정의하고 ModelBuilder 유형의 modelBuilder 매개 변수를 사용하여 아래와 같이 도메인 클래스를 만들 수 있습니다.
public class SchoolDBContext: DbContext 
{
    public DbSet<Student> Students { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Write Fluent API configurations here

        //Property Configurations
        modelBuilder.Entity<Student>()
                .Property(s => s.StudentId)
                .HasColumnName("Id")
                .HasDefaultValue(0)
                .IsRequired();
    }
}
  • 위의 예에서 ModelBuilder Fluent API 인스턴스는 체인에서 여러 메서드를 호출하여 속성을 구성하는 데 사용됩니다.
  • 학생 엔터티의 StudentID 속성을 구성합니다.
  • HasColumnName을 사용하여 이름을 구성하고 HasDefaultValue를 사용하여 기본값을 구성하고 IsRequired 메서드를 사용하여 여러 문이 아닌 단일 문에서 null 허용 여부를 구성합니다.
  • 위와 같이 작성하면 가독성이 좋아지고 아래와 같이 여러 문장에 비해 작성 시간이 단축되는 이점이 있습니다.
//Fluent API method chained calls
modelBuilder.Entity<Student>()
        .Property(s => s.StudentId)
        .HasColumnName("Id")
        .HasDefaultValue(0)
        .IsRequired();

//Separate method calls
modelBuilder.Entity<Student>().Property(s => s.StudentId).HasColumnName("Id");
modelBuilder.Entity<Student>().Property(s => s.StudentId).HasDefaultValue(0);
modelBuilder.Entity<Student>().Property(s => s.StudentId).IsRequired();