2015-10-24 51 views
0

我正在使用WPF和实体框架6编写课程选择程序。在我的数据库中,我有三个表格,一个用于希望选择课程的学生,一个用于关于课程信息(名称课程开始时间等),另一个是关于教师的信息。我在我的程序中列出了所有课程的相关数据,但由于教师存在于不同的表格中,因此我无法在我的ListView中显示他们的其他字词。我在加入两个数据时遇到问题表,并显示在一个单一的ListView:显示来自两个表格的信息表

here is an image from my database schema in entity framework

,这是我为显示在ListView迄今我无法显示教师的课程的代码数据由于上面的问题解释

 private void button_Click(object sender, RoutedEventArgs e) 
    { 
     using (var context = new Model1Container()) 
     { 

      var course_List = new List<course>(); 
      foreach (var course in context.courses) 
      { 
       course_List.Add(course); 
      } 
      listView.ItemsSource = course_List; 
     } 
    } 
+0

你试过什么样的xaml?导航属性在那里,你只需要用点符号来获得教师数据。调试并检查'course_list',老师是否也进来? – Crowcoder

回答

0

您拥有之间的一对多关系和Instructor,因此,您需要输入Course实体navigation property,您可以使用instructor来显示相关教师。现在

我的第一个建议是,你并不需要在所有的课程重复,以创建一个列表,你可以这样做:

using (var context = new Model1Container()) 
    { 
     var course_List = context.courses.Include(c=>c.instructor).ToList(); 
     listView.ItemsSource = course_List; 
    } 

Include扩展方法可以让你在查询相关对象包括:您希望包含在查询结果中。

现在,要查看Course信息和相关Instructor您可以定义一个自定义ItemTemplate。正如我之前所说,instructor是一个Course属性,所以,你可以做这样的事情。

<ListView.ItemTemplate> 
     <DataTemplate> 
      <WrapPanel> 
      ... 
      <TextBlock Text="Instructor: " /> 
      <TextBlock Text="{Binding instructor.name}" FontWeight="Bold" /> 
      </WrapPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
+0

@SaeidGhafouri,如果您不包含'instructor'导航属性作为查询的一部分,当您尝试检查导师导航时,EF将引发异常。您的上下文实例死后,您列表中任何课程中的属性。因此,为了避免这种情况,您需要在查询中包含每门课程随相关教师提供的内容。 – octavioccl

+0

究竟应该在哪里写第一个(我的意思是代码而不是xaml)语句?在我自己的代码之后或之前的答案中,如果是这样(在以前的答案中)究竟在哪里? –

0

我认为这是btter有InsctruorId在课程表,并使用下面的代码加盟脊髓痨

 private void button_Click(object sender, RoutedEventArgs e) 
     { 
      using (var context = new Model1Container()) 
      { 

       var course_List = new List<course>(); 
       foreach (var course in GetAllCources) 
       { 
        course_List.Add(course); 
       } 
       listView.ItemsSource = course_List; 
      } 
     } 

     private List<course> GetAllCources() 
     { 
      return (from c in context.cources 
      join i in context.instructors on c.instructorId equals c.Id 
      select new 
      { 
       Cources = c, 
       Instructors = i, 
      }).AsEnumerable().Select(c => new Cources 
      { 
       . 
       . 
       All required fields 
       . 
       . 
       . 
      } : null).AsQueryable(); 
     } 

您可以使用包括如果不想选择属性。

+0

我应该在哪里准确定义GetAllCourse?因为按照您在此处编写的方式进行操作,我会在上下文中发现错误,这是因为它没有被定义,以及“所有必填字段”是什么意思?如果我的问题看起来很愚蠢,我也很抱歉,这件事很抱歉! –