在ADO.net上查看复杂的多对多关系

时间:2014-08-25 06:41:30

标签: c# asp.net-mvc entity-framework ado.net many-to-many

我正在尝试使用ADO.net更新多对多关系中的相关数据库

这是我的数据库设计enter image description here

你们注意到,实体框架不会映射class_student& subject_course,我一直在搜索该方法并找到了这个网站:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

该网站告诉我制作一个viewModel,我这样做:

    namespace Test.Models.ViewModels
    {
        public class AssignedStudentData
        {
            public int ID { get; set; }
            public string course_code { get; set; }
            public bool Assigned { get; set; }
        }
    }

它的工作完美无缺,但我的问题是这行代码:

    private void PopulateAssignedStudentData(ms_class ms_class)
    { 
        var allStudent = db.ms_student; //this line is the problem
        var ClassStudent = new HashSet<int>(ms_class.ms_student.Select(c => c.ID));
        var viewModel = new List<AssignedStudentData>();
        foreach (var student in allStudent)
        {
            viewModel.Add(new AssignedStudentData
            {
                ID = student.ID,
                course_code = student.ms_course.course_name,
                Assigned = ClassStudent.Contains(student.ID)
            });
        }

        ViewBag.Students = viewModel;
    }

在var allStudent中,我试图让系统不会生成所有的学生,而是学生用一个主题分配,例如:

    private void PopulateAssignedStudentDataBySubject(ms_class ms_class, int subject_id)
    { 
        //var allStudent = db.ms_student; //this line is the problem
        //My Version:

        var allStudentByCourse = db.ms_student.Include(m => m.ms_course).Where(m => m.ms_course.ms_subject.subject_id == subject_id); //this code is not working

        var ClassStudent = new HashSet<int>(ms_class.ms_student.Select(c => c.ID));
        var viewModel = new List<AssignedStudentData>();
        foreach (var student in allStudentByCourse )
        {
            viewModel.Add(new AssignedStudentData
            {
                ID = student.ID,
                course_code = student.ms_course.course_name,
                Assigned = ClassStudent.Contains(student.ID)
            });
        }

        ViewBag.Students = viewModel;
    }

我认为代码不起作用,因为ms_course和ms_subject是多对多的关系。

非常感谢

public partial class ms_course
{
    public ms_course()
    {
        this.ms_student = new HashSet<ms_student>();
        this.ms_subject = new HashSet<ms_subject>();
    }
    public int course_id { get; set; }
    public string course_code { get; set; }
    public string course_name { get; set; }
    public virtual ICollection<ms_student> ms_student { get; set; }
    public virtual ICollection<ms_subject> ms_subject { get; set; }
}

2 个答案:

答案 0 :(得分:1)

我了解您正在寻找拥有至少分配了一个特定主题的课程的学生。那将是:

db.ms_student
  .Where(s => s.ms_course.ms_subject
               .Any(sb => sb.subject_id == subject_id)))

总是帮助我首先在对象模型方面清楚地表达问题,正如我在第一句中所做的那样。它通常会显示查询的外观。

答案 1 :(得分:0)

错误消息说什么?

您可以尝试:

var allStudentByCourse = db.ms_student.Include(m => m.ms_course).Include("ms_course.ms_subject").Where(m => m.ms_course.ms_subject.subject_id == subject_id); 

alternativ2(仅当ms_course具有ms_subject的fk属性时才有效):

var allStudentByCourse = db.ms_student.Include(m => m.ms_course).Where(m => m.ms_course.subject_id == subject_id); 

更新

var allStudentByCourse = db.ms_student.Include(m => m.ms_course).Include("ms_course.ms_subject").Where(m => m.ms_course.ms_subject.Any(s => s.subject_id == subject_id));