참조
소개
- 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 허용 여부, 외래 키, 데이터 유형, 동시성 열 등
- 모델 구성: 데이터베이스 매핑을 위한 EF 모델을 구성합니다.
구성 유형 정보
- 다음 표에는 각 구성 유형에 대한 중요한 방법이 나열되어 있습니다.
구성 | 흐르는 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();