Entity Framework
코드 우선 - 유창한 API
수색…
비고
Entity Framework에서 POCO 클래스를 데이터베이스 테이블, 열 등으로 매핑하는 방법은 일반적으로 두 가지가 있습니다. 데이터 주석 및 Fluent API .
데이터 주석은 읽기 쉽고 이해하기 쉽지만 엔티티의 "삭제할 때 캐스케이드"동작을 지정하는 것과 같은 특정 기능이 부족합니다. 반면 Fluent API는 사용하기가 다소 복잡하지만 훨씬 더 고급 기능을 제공합니다.
모델 매핑
EntityFramewok Fluent API는 코드 우선 도메인 모델을 기본 데이터베이스에 매핑하는 강력하고 우아한 방법입니다. 이것은 또한 기존 데이터베이스와 함께 코드 우선 으로 사용될 수 있습니다. Fluent API를 사용할 때는 OnModelCreating 메서드에서 모델을 직접 매핑하거나 EntityTypeConfiguration 에서 상속되는 매퍼 클래스를 만든 다음 OnModelCreating 메서드에서 해당 모델을 modelBuilder 에 추가 할 수 있습니다. 두 번째 옵션은 내가 선호하는 예이며 그 예를 보여줍니다.
1 단계 : 모델을 만듭니다.
public class Employee
{
public int Id { get; set; }
public string Surname { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public short Age { get; set; }
public decimal MonthlySalary { get; set; }
public string FullName
{
get
{
return $"{Surname} {FirstName} {LastName}";
}
}
}
2 단계 : 매퍼 클래스 만들기
public class EmployeeMap
: EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
// Primary key
this.HasKey(m => m.Id);
this.Property(m => m.Id)
.HasColumnType("int")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(m => m.Surname)
.HasMaxLength(50);
this.Property(m => m.FirstName)
.IsRequired()
.HasMaxLength(50);
this.Property(m => m.LastName)
.HasMaxLength(50);
this.Property(m => m.Age)
.HasColumnType("smallint");
this.Property(m => m.MonthlySalary)
.HasColumnType("number")
.HasPrecision(14, 5);
this.Ignore(m => m.FullName);
// Table & column mappings
this.ToTable("TABLE_NAME", "SCHEMA_NAME");
this.Property(m => m.Id).HasColumnName("ID");
this.Property(m => m.Surname).HasColumnName("SURNAME");
this.Property(m => m.FirstName).HasColumnName("FIRST_NAME");
this.Property(m => m.LastName).HasColumnName("LAST_NAME");
this.Property(m => m.Age).HasColumnName("AGE");
this.Property(m => m.MonthlySalary).HasColumnName("MONTHLY_SALARY");
}
}
매핑에 대해 설명합시다.
- HasKey - 기본 키를 정의합니다. 복합 기본 키를 사용할 수도 있습니다. 예 : this.HasKey (m => new {m.DepartmentId, m.PositionId}) .
- 속성 - 모델 속성을 구성 할 수 있습니다.
- HasColumnType - 데이터베이스 수준 열 유형을 지정합니다. Oracle 및 MS SQL과 같은 다른 데이터베이스에 따라 다를 수 있습니다.
- HasDatabaseGeneratedOption - 속성이 데이터베이스 수준에서 계산되는지 여부를 지정합니다. 숫자 PK와 당신이 그들을 그렇게되고 싶지 않는 경우가 DatabaseGeneratedOption.None를 지정해야 기본적으로 DatabaseGeneratedOption.Identity이다.
- HasMaxLength - 문자열의 길이를 제한합니다.
- IsRequired - 속성을 재구성 된 것으로 표시합니다.
- HasPrecision - 십진수의 정밀도를 지정합니다.
- 무시 - 속성을 완전히 무시하고 데이터베이스에 매핑하지 않습니다. FullName은 테이블에서이 열을 원하지 않기 때문에 무시했습니다.
- ToTable - 모델의 테이블 이름과 스키마 이름을 지정합니다 (선택 사항).
- HasColumnName - 열 이름과 속성을 연결합니다. 속성 이름과 열 이름이 동일한 경우에는 필요하지 않습니다.
3 단계 : 매핑 클래스를 구성에 추가합니다.
우리는 매퍼 클래스를 사용하도록 EntityFramework에 알려야합니다. 그렇게하려면 OnModelCreating 메소드의 modelBuilder.Configurations 에 추가해야합니다.
public class DbContext()
: base("Name=DbContext")
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new EmployeeMap());
}
}
그리고 그것이 바로 그 것이다. 우리는 모두 갈 준비가되어 있습니다.
기본 키
.HasKey () 메서드를 사용하면 속성을 엔터티의 기본 키로 명시 적으로 구성 할 수 있습니다.
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>().HasKey(p => p.PersonKey);
}
}
복합 기본 키
.HasKey () 메서드를 사용하면 속성 집합을 엔터티의 복합 기본 키로 명시 적으로 구성 할 수 있습니다.
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>().HasKey(p => new { p.FirstName, p.LastName });
}
}
최대 길이
.HasMaxLength () 메서드를 사용하면 속성에 대해 최대 문자 수를 구성 할 수 있습니다.
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>()
.Property(t => t.Name)
.HasMaxLength(100);
}
}
지정된 열 길이를 갖는 결과 열 :
필수 속성 (NOT NULL)
.IsRequired () 메서드를 사용하면 속성을 필수로 지정할 수 있습니다. 즉, 열이 NOT NULL 제약 조건을 갖습니다.
using System.Data.Entity;
// ..
public class PersonContext : DbContext
{
// ..
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ..
modelBuilder.Entity<Person>()
.Property(t => t.Name)
.IsRequired();
}
}
NOT NULL 제약 조건을 가진 결과 컬럼 :
외부 키 이름 지정
모델에 탐색 속성이 있으면 Entity Framework에서 자동으로 외부 키 열을 만듭니다. 특정 외래 키 이름이 필요하지만 모델의 속성으로 포함되지 않은 경우 Fluent API를 사용하여 명시 적으로 설정할 수 있습니다. 외래 키 관계를 설정하는 동안 Map
메서드를 사용하면 외래 키에 대해 고유 한 이름을 사용할 수 있습니다.
public class Company
{
public int Id { get; set; }
}
public class Employee
{
property int Id { get; set; }
property Company Employer { get; set; }
}
public class EmployeeContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.HasRequired(x => x.Employer)
.WithRequiredDependent()
.Map(m => m.MapKey("EmployerId"));
}
}
관계를 지정한 후 Map
메서드를 사용하면 MapKey
를 실행하여 외래 키 이름을 명시 적으로 설정할 수 있습니다. 이 예에서 Employer_Id라는 열 이름을 얻게 된 것은 이제 EmployerId입니다.