3

Can someone point out where I've got wrong!!

I have created 2 simple classes, with many-to-many relationship. Works fine, all the tables are populated correctly. Except when I try and retrive any Students courses nothing is returned...

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 Answer 1

8

If you are using lazy loading you need to defiine properties as virtual ,

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

and if you want you can use eager loading,

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

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

Sign up to request clarification or add additional context in comments.

2 Comments

@Karb: You can "accept" answers by clicking on the white check mark left to the answer to indicate that the answer did solve your problem.
You saved me an obscene amount of time with this. I forgot to make a couple collections virtual and didn't even think to check that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.