EF核心中的多对多

时间:2019-06-26 23:42:50

标签: ef-core-2.0

我有以下型号

public class Student
    {
       public int Id {get; set; }
       public string Name {get; set; }
       public ICollection<StudentToCourse> StudentToCourse {get; set; }
    }
    public class StudentToCourse
    {
       public int StudentId{get; set; }
       public Student Student {get; set; }
       public int CourseId{get; set; }
       public Course Course {get; set; }
    }
    public class Course
    {
       public int Id {get; set; }
       public string Name {get; set; }
       public ICollection<StudentToCourse> StudentToCourse {get; set; }
    }

我想获取每个学生证的所有课程列表,该怎么做?

1 个答案:

答案 0 :(得分:0)

简短答案:选择并匹配ID值。或以编程方式-

foreach(Student s in yourstudentList)
{
    foreach(StudentToCourse stc in s.StudentToCourse)
    {
        if(stc.StudentId = s.Id)
            //this is one you want, do something with it
    }
}

更好的答案:

首先让我们看一下您的模型...

想象一下基础数据库结构。

您的中间表被称为查找。
您实际上并不需要整个学生,也不需要其中的整个课程对象。 另外,您的Course对象不需要了解其他任何一个对象。

如果您可以想象数据库中的三个表,您将看到如何在逻辑上将学生连接到课程中的三个表。

您的模型仍然不完整。在您的应用程序中,您仍然需要一个容器,在这种情况下为List courseIds。这样,您的学生无需关心学生/课程查找表中的所有条目,只需关心适用于特定学生的条目即可。而且您有一个易于访问的对象,可以从数据库中提取数据或向数据库发送更新。

对于courseIds集合的初始填充,您将执行       SELECT FROM StudentToCourse where StudentId = x

然后,您可以在“课程”表上联接以提取诸如课程名称之类的值。 如果发现需要进行大量查找,则可以缓存课程列表并降低数据库流量,但需要付出一些代价。

每次结交新学生时,您都希望填充其课程ID列表;将学生提交数据库时,您将保存查找表。

这使您的对象在保持其关系的同时尽可能轻巧。

有多种方法可以在您的开发环境中编写SELECT语句,进行搜索,找到您喜欢的(或与您公司的当前实践相符)并习惯于始终使用同一条语句。它将使您的代码更具可读性和可管理性。

相关问题