Code First Entity Framework отношения «многие ко многим» - PullRequest
3 голосов
/ 21 марта 2012

Может кто-нибудь указать, где я ошибся !!

Я создал 2 простых класса с отношением «многие ко многим». Работает нормально, все таблицы заполнены правильно. За исключением случаев, когда я пытаюсь получить какие-либо курсы для студентов, ничего не возвращается ...

public partial class Student 
{

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

    public int StudentID { get; set; }

    [StringLength(50)] 
    [Required]
    public string FirstName { get; set;}

    [StringLength(50)]
    [Required]
    public string LastName {get; set;}

    public DateTime? Enroled {get;set;}

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


}

public class Course
{

    public Course()
    {
        Students = new HashSet<Student>();
    }
    public int CourseID { get; set; }

    [StringLength(30)]
    [Required]
    public string CourseTitle { get; set; }

    [StringLength(255)]
    public string CourseDesc { get; set; }

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

    public ContextDB()
        : base (@"Data Source=.\SQLEXPRESS;Initial Catalog=CollegeDB;Integrated Security=True")
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Course>().HasMany(c=>c.Students).WithMany(p => p.Courses)
            .Map(
            m=> {
                m.MapLeftKey("Course_CourseID");
                m.MapRightKey("Student_StudentID");
                m.ToTable("CourseStudents");
            });
    }

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


}



          var students = db.Students.ToList();

            foreach (Student s in students)
            {
                Console.WriteLine("{0} {1}", s.FirstName, s.LastName);
                foreach (Course c in s.Courses.ToList())
                {
                    Console.WriteLine("{0}", c.CourseTitle);
                }
            }

1 Ответ

8 голосов
/ 21 марта 2012

Если вы используете отложенную загрузку, вам нужно определить свойства как виртуальные,

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

и, если хотите, можете использовать загрузку,

var students = db.Students.Include(s=>s.Courses).ToList();

http://codetuner.blogspot.com/2011/07/entity-framework-differed-loading-lazy.html

...