2014-05-23 34 views
0

返回任何行,我寫了這個代碼爲什麼沒有實體框架從相關表

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

    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 
} 

class Course { 
    public Course() { 
     this.Students = new HashSet<Student>(); 
    } 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Student> Students { get; set; } 
} 

class SchoolDBContext : DbContext { 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Course> Courses { get; set; } 

    public SchoolDBContext() 
     : base("SchoolDbConnectionString") {    
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

我種方法看起來像

protected override void Seed(ConsoleApplication6.SchoolDBContext context) 
{ 
    Course c1 = new Course { ID = 1, Name = "Chemistry" }; 
    Course c2 = new Course { ID = 2, Name = "Maths" }; 
    Course[] courses = new Course[2]; 
    courses[0] = c1; 
    courses[1] = c2; 
    Student s1 = new Student { ID = 1, Name = "Student 1" }; 
    Student s2 = new Student { ID = 1, Name = "Student 2" }; 
    Student[] students = new Student[2]; 
    students[0] = s1; 
    students[1] = s2; 
    c1.Students = students; 
    c2.Students = students; 
    context.Courses.AddOrUpdate(course => new { course.ID }, courses);    
} 

我跑更新數據庫後,我可以看到數據庫有3張桌子。學生和課程表各有2行,StudentCourse表有4行。所以我想所有數據都是正確播種的。

現在,當我寫這篇文章的代碼在我的主要方法

static void Main(string[] args) { 
     SchoolDBContext c = new SchoolDBContext(); 
     c.Configuration.LazyLoadingEnabled = true; 
     Student s = (from student in c.Students where student.ID == 1 select student).FirstOrDefault(); 
     List<Course> courses = s.Courses.ToList(); 
     Console.WriteLine(s.Name); 
     Console.WriteLine(courses.Count); 
     foreach (Course co in courses) { 
      Console.WriteLine(co.Name); 
     } 
    } 

它正確打印學生的名字,而是爲了courses.Count打印0和課程列表中的for循環沒有返回。

爲什麼我無法獲得學生1的課程?

我也嘗試了另一種方式圓

static void Main(string[] args) { 
     SchoolDBContext c = new SchoolDBContext(); 
     c.Configuration.LazyLoadingEnabled = true; 
     Course co = (from course in c.Courses where course.ID == 1 select course).FirstOrDefault(); 
     Console.WriteLine(co.Name); 
     List<Student> students = co.Students.ToList(); 
     foreach (Student s in students) { 
      Console.WriteLine(s.Name); 
     } 
    } 

這裏也返回正確的課程的名稱...但它不打印任何學生。

所以實體框架不能走到相關的表並從那裏取行。

發生了什麼事?

回答

0

我自己找到答案。

static void Main(string[] args) { 
     SchoolDBContext c = new SchoolDBContext(); 
     c.Configuration.LazyLoadingEnabled = false; 
     Course co = (from course in c.Courses.Include("Students") where course.ID == 1 select course).FirstOrDefault(); 
     Console.WriteLine(co.Name); 
     List<Student> students = co.Students.ToList(); 
     foreach (Student s in students) { 
      Console.WriteLine(s.Name); 
     } 
    } 

將在這裏以使其造福別人....

但根據我我的原代碼,應該有工作(延遲加載),所以我不明白爲什麼我的原代碼,這是做懶加載不起作用。

0

好的。這裏是延遲加載的解決方案

static void Main(string[] args) { 
     SchoolDBContext context = new SchoolDBContext(); 
     context.Configuration.LazyLoadingEnabled = true; 
     Course co = (from course in context.Courses where course.ID == 1 select course).FirstOrDefault(); 
     //Course co = (from course in c.Courses where course.ID == 1 select course).FirstOrDefault(); 
     Console.WriteLine(co.Name); 
     foreach (Student s in context.Entry(co).Collection(c => c.Students).Query()) { 
      Console.WriteLine(s.Name); 
     } 
    } 

這是非常有用的

http://msdn.microsoft.com/en-us/data/jj574232#lazy