수색…


비고

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입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow