2016-10-19 5 views
2

일부 Entity Framework 코드 첫 번째 모델에서 일부 탐색 속성을 설정하려고합니다. 이 예제처럼 보이게하고 싶습니다.Entity Framework 코드 관계형 테이블을 통한 첫 번째 탐색 속성

public class Course 
{ 
    [Key] 
    public int CourseId { get; set; } 
    public string CourseName { get; set; } 
    public virtual ICollection<Student> Students { get; set; } 
} 

public class Student 
{ 
    [Key] 
    public int StudentId { get; set; } 
    public string StudentName { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 
} 

public class StudentCourses 
{ 
    [Key, Column(Order = 0)] 
    public int StudentId { get; set; } 
    public virtual Student Student { get; set; } 
    [Key, Column(Order = 1)] 
    public int CourseId { get; set; } 
    public virtual Course Course { get; set; } 
} 

학생과 코스 관계가 StudentCourses 테이블에 설정됩니다. 학생 클래스의 인스턴스는 자동으로 모든 학생 코스를 참조하며, 그 반대로 Course 클래스 인스턴스는 모든 학생을 자동으로 참조합니다. 그리고 StudentCourses 클래스의 인스턴스는 자동으로 Student 및 Course를 참조합니다. 그러나 Update-Database를 시도 할 때 관계가 제대로 해석되지 않는 것 같습니다. 내가 여기서 누락 된 것이 있습니까? 아마도 컨텍스트 클래스에서 구성해야 할 필요가 있을까요? 탐색 속성의 대부분의 예제는 일대 다 관계 탐색 속성 만 표시합니다.

답변

2

M : M 관계가있을 때 아래와 같이 모델을 구성해야합니다. 접합부 테이블을 작성할 필요가 없습니다. EF는 데이터 이전을 수행 할 때 EF가 자동으로 생성합니다.

규칙을 사용하는 모델 구성.

public class Student 
{ 
    public Student() 
    { 
     this.Courses = new HashSet<Course>(); 
    } 

    public int StudentId { get; set; } 

    public string StudentName { get; set; } 

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

public class Course 
{ 
    public Course() 
    { 
     this.Students = new HashSet<Student>(); 
    } 

    public int CourseId { get; set; } 
    public string CourseName { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 

컨텍스트 등급은 이와 같아야합니다.

public class YourDBContext : DBContext 
{ 
    public YourDBContext() : base("Default") 
    { 
    } 

    public DbSet<Student> Students { get; set; } 

    public DbSet<Course> Courses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
    } 
} 
+0

아, 그래서 EF는 그 테이블을 모델에서 완전히 추상화합니다. 나는 EF가 생성하는 접합 테이블에 대한 클래스가 필요할 것이라고 생각했지만 탐색 속성을 사용하면 불필요하다고 생각합니다. – Sneakster

+0

예, EF가 자동으로 접합 테이블을 작성합니다. 수동으로 할 필요는 없습니다. – Sampath

1

Sampath의 조언을 따른 후 실제로 관계에 몇 가지 속성을 추가하기로 결정했습니다. 그래서 나는이 같은 Afterall는 StudentCourses 클래스를 정의 결국 :

public class StudentCourses 
{ 
    [Key, Column(Order = 0)] 
    public int StudentId { get; set; } 
    public virtual Student Student { get; set; } 
    [Key, Column(Order = 1)] 
    public int CourseId { get; set; } 
    public virtual Course Course { get; set; } 
    public int Grade { get; set; } 
} 

그래서 나는 학생 및 과정은 다음과 같이 변경 :

public class Course 
{ 
    [Key] 
    public int CourseId { get; set; } 
    public string CourseName { get; set; } 
    public virtual ICollection<StudentCourses> Students { get; set; } 
} 

public class Student 
{ 
    [Key] 
    public int StudentId { get; set; } 
    public string StudentName { get; set; } 
    public virtual ICollection<StudentCourses> Courses { get; set; } 
} 

그리고 가장 중요한, 나는 DbContext에 StudentCourses를 추가하지 않았다. 따라서 Update-Database가 수행 된 후 EF가 StudentCourses에 대한 테이블을 자동으로 만들고 탐색 속성이 모두 작동합니다.