다음을 통해 공유


Code First 규칙

Code First를 사용하면 C# 또는 Visual Basic .NET 클래스를 통해 모델을 설명할 수 있습니다. 모델의 기본 모양은 규칙을 사용하여 검색됩니다. 규칙은 Code First를 사용하여 작업할 때 클래스 정의를 기반으로 개념적 모델을 자동으로 구성하는 데 사용되는 규칙의 집합입니다. 규칙은 System.Data.Entity.ModelConfiguration.Conventions 네임스페이스에 정의되어 있습니다.

데이터 주석 또는 흐름 API를 사용하여 모델을 추가로 구성할 수 있습니다. 흐름 API와 데이터 주석 및 규칙을 통해 구성에 우선 순위가 지정됩니다. 자세한 내용은 데이터 주석, Fluent API - 관계, Fluent API - 형식 및 속성VB.NET이 있는 Fluent API를 참조하세요.

Code First 규칙의 자세한 목록은 API 설명서에서 확인할 수 있습니다. 이 항목에서는 Code First에서 사용하는 규칙에 대한 개요를 제공합니다.

형식 검색

Code First 개발을 사용하는 경우 일반적으로 개념적(도메인) 모델을 정의하는 .NET Framework 클래스를 작성하는 것으로 시작합니다. 클래스를 정의하는 것 외에도 DbContext가 모델에 포함할 형식을 알 수 있도록 해야 합니다. 이를 수행하려면 DbContext에서 파생되고 모델의 일부가 될 형식에 대한 DbSet 속성을 노출하는 컨텍스트 클래스를 정의합니다. Code First는 이러한 형식을 포함하며 참조된 형식이 다른 어셈블리에 정의되어 있더라도 참조된 모든 형식을 끌어올 수 있습니다.

형식이 상속 계층 구조에 참여하는 경우 기본 클래스에 대한 DbSet 속성을 정의하기에 충분하며 파생 형식이 기본 클래스와 동일한 어셈블리에 있는 경우 자동으로 포함됩니다.

다음 예제에서는 SchoolEntities 클래스(Departments)에 하나의 DbSet 속성만 정의되어 있습니다. Code First는 이 속성을 사용하여 참조된 형식을 검색하고 끌어올 수 있습니다.

public class SchoolEntities : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

public partial class OnlineCourse : Course
{
    public string URL { get; set; }
}

public partial class OnsiteCourse : Course
{
    public string Location { get; set; }
    public string Days { get; set; }
    public System.DateTime Time { get; set; }
}

모델에서 형식을 제외하려면 NotMapped 특성 또는 DbModelBuilder.Ignore 흐름 API를 사용합니다.

modelBuilder.Ignore<Department>();

기본 키 규칙

Code First는 클래스의 속성 이름이 "ID"(대/소문자 구분 안 함) 또는 클래스 이름 뒤에 "ID"가 오는 경우 속성이 기본 키임을 유추합니다. 기본 키 속성의 형식이 숫자 또는 GUID인 경우 ID 열로 구성됩니다.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }

    . . .  

}

관계 규칙

Entity Framework에서 탐색 속성은 두 엔터티 형식 간의 관계를 탐색하는 방법을 제공합니다. 모든 개체에는 해당 개체가 참여하는 모든 관계에 대한 탐색 속성이 있습니다. 탐색 속성을 사용하면 양방향에서 관계를 탐색 및 관리하고, 참조 개체(다중성이 1인 경우 또는 0이나 1인 경우)나 개체 컬렉션(다중성이 다수인 경우)을 반환할 수 있습니다. Code First는 형식에 정의된 탐색 속성을 기반으로 관계를 유추합니다.

탐색 속성 외에도 종속 개체를 나타내는 형식에 외래 키 속성을 포함하는 것이 좋습니다. 주 기본 키 속성과 데이터 형식이 동일하고 이름이 '<탐색 속성 이름><주 기본 키 속성 이름>', '<주 클래스 이름><기본 키 속성 이름>' 또는 '<주 기본 키본 속성 이름>' 형식 중 하나를 따르는 모든 속성은 관계의 외래 키를 나타냅니다. 여러 일치 항목이 발견되면 위에 나열된 순서대로 우선 순위가 지정됩니다. 외래 키 검색은 대/소문자를 구분하지 않습니다. 외래 키 속성이 검색되면 Code First는 외래 키의 null 허용 여부를 기반으로 관계의 다중성을 유추합니다. 속성이 null 허용이면 관계가 선택 사항으로 등록되며, 그렇지 않으면 관계가 필요에 따라 등록됩니다.

종속 엔터티의 외래 키가 null을 허용하지 않는 경우 Code First는 관계에 대한 계단식 삭제를 설정합니다. 종속 엔터티의 외래 키가 null을 허용하면 Code First는 관계에 대한 계단식 삭제를 설정하지 않으며 주가 삭제되면 외래 키가 null로 설정됩니다. 규칙에 의해 검색된 다중성 및 계단식 삭제 동작은 흐름 API를 사용하여 재정의할 수 있습니다.

다음 예제에서는 탐색 속성과 외래 키를 사용하여 Department 클래스와 Course 클래스 간의 관계를 정의합니다.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

참고 항목

동일한 형식 간에 여러 관계가 있는 경우(예를 들어 PersonBook 클래스를 정의한다고 가정합니다. 여기서 Person 클래스에는 ReviewedBooksAuthoredBooks 탐색 속성이 포함되고 Book 클래스에는 작성자검토자 탐색 속성이 포함됨) 데이터 주석 또는 흐름 API를 사용하여 관계를 수동으로 구성해야 합니다. 자세한 내용은 데이터 주석 - 관계흐름 API - 관계를 참조하세요.

복합 형식 규칙

Code First가 기본 키를 유추할 수 없고 데이터 주석 또는 흐름 API를 통해 기본 키가 등록되지 않은 클래스 정의를 검색하면 형식이 자동으로 복합 형식으로 등록됩니다. 복합 형식 검색을 사용하려면 형식에 엔터티 형식을 참조하는 속성이 없고 다른 형식의 컬렉션 속성에서 참조되지 않아야 합니다. 다음 클래스 정의를 고려할 때 Code First는 기본 키가 없기 때문에 세부 정보가 복합 형식이라고 유추합니다.

public partial class OnsiteCourse : Course
{
    public OnsiteCourse()
    {
        Details = new Details();
    }

    public Details Details { get; set; }
}

public class Details
{
    public System.DateTime Time { get; set; }
    public string Location { get; set; }
    public string Days { get; set; }
}

연결 문자열 규칙

DbContext에서 사용할 연결을 검색하는 데 사용하는 규칙에 대해 알아보려면 연결 및 모델을 참조하세요.

규칙 제거

System.Data.Entity.ModelConfiguration.Conventions 네임스페이스에 정의된 규칙을 제거할 수 있습니다. 다음 예제에서는 PluralizingTableNameConvention을 제거합니다.

public class SchoolEntities : DbContext
{
     . . .

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configure Code First to ignore PluralizingTableName convention
        // If you keep this convention, the generated tables  
        // will have pluralized names.
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

사용자 지정 규칙

사용자 지정 규칙은 EF6 이상에서 지원됩니다. 자세한 내용은 사용자 지정 Code First 규칙을 참조하세요.