2016-10-19 3 views
2

Я пытаюсь настроить некоторые свойства навигации с помощью некоторых моделей Entity Framework Code First. Я хотел бы, чтобы они выглядели как в этом примере:Entity Framework Code Первое свойство навигации через реляционную таблицу

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 автоматически ссылается на его ученик и курс. Но когда я пытаюсь обновить-базу данных, отношения, похоже, не интерпретируются должным образом. Здесь что-то не хватает? Возможно, некоторые настройки необходимо выполнить в классе контекста? Большинство примеров свойств навигации просто показывают свойства навигации по принципу «один ко многим».

ответ

2

Вам необходимо создать свои модели, как показано ниже, когда у вас есть отношение M : M. Вам не нужно создавать таблицу соединений. 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 Afterall, как это:

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; } 
} 

И самое главное, я не добавлял StudentCourses к DbContext. Таким образом, после выполнения обновления базы данных EF автоматически создала таблицу для StudentCourses, и все свойства навигации все работают.