2016-10-19 17 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テーブルに学生とコースの関係が確立されます。生徒クラスのインスタンスは自動的にその生徒のすべてのコースを参照し、逆も成り立つ場合、コースクラスのインスタンスはすべての生徒を自動的に参照します。そして、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

サンパスのアドバイスに従った後、実際に私は関係にいくつかのプロパティを付けたいと決めました。だから私はこのようやっぱ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用のテーブルが自動的に作成され、ナビゲーションプロパティがすべて機能します。

関連する問題