【问题标题】:Showing information form from two tables显示来自两个表的信息表
【发布时间】:2015-10-24 12:39:59
【问题描述】:

我正在使用 WPF 和实体框架 6 编写课程选择程序。在我的数据库中,我有三个表,一个用于希望选择课程的学生,一个用于有关课程的信息(课程名称、开始时间等)和一个关于教师的信息。我的程序中有一个部分列出了所有课程以及每个课程的相应数据,但是由于讲师存在于不同的表格中,我无法在我的 ListView 中显示它们,换句话说,我在加入两个数据时遇到问题表并在单个 ListView 中显示它们:

这是我在 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;
        }
    }

【问题讨论】:

  • 您尝试了哪些 xaml?导航属性在那里,您应该只需要使用点符号来获取讲师数据。调试检查course_list,导师也进来吗?

标签: c# wpf database entity-framework listview


【解决方案1】:

CourseInstructor 之间存在一对多关系,因此,在 Course 实体中,您有一个名为 navigation propertynavigation property,可用于显示相关讲师。

现在我的第一个建议是您不需要遍历所有课程来创建列表,您可以这样做:

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

Include 扩展方法允许您在查询中包含您希望包含在查询结果中的相关对象。

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

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

【讨论】:

  • @SaeidGhafouri,如果您没有将instructor 导航属性作为查询的一部分,当您尝试检查讲师导航时,EF 将抛出异常。在您的上下文实例死亡后,您列表中任何课程的属性。因此,为避免您需要在查询中包含每门课程与相关讲师一起提供的信息。
  • 我应该把你写的第一个(我的意思是代码而不是 xaml)语句放在哪里?在我自己的代码之后或在上一个答案中,如果是(在上一个答案中)究竟在哪里?
【解决方案2】:

我认为最好在课程表中有 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();
        } 

如果不想选择属性,可以使用Include

【讨论】:

  • 我应该在哪里准确定义 GetAllCourse?因为按照您在此处编写的方式进行操作,我得到了上下文的错误,据说它没有定义,您所说的“所有必填字段”到底是什么意思?我也很新,如果我的问题看起来很愚蠢,对不起!
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2021-02-11
  • 2016-06-19
相关资源
最近更新 更多