2012-03-21 158 views
3

有人可以指出我哪里有错!代码第一个实体框架多对多的关系

我创建了2个简单的类,具有多对多的关系。工作正常,所有的表都填写正确。除了当我尝试retrive返回课程没有任何学生...

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

回答

8

如果使用延迟加载,你需要defiine性质为虚,

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

+0

由于现在工作得很好! – Karb 2012-03-21 12:15:48

+6

@Karb:您可以通过点击答案中留下的白色复选标记来“接受”答案,以表明答案确实解决了您的问题。 – Slauma 2012-03-21 20:00:08

+0

你用这个为我节省了不少时间。我忘记做一对夫妇收藏虚拟,甚至没有想到要检查。 – lintmouse 2013-05-14 04:03:54

相关问题