一对多的循环关系

本文关键字:关系 循环 一对多 | 更新日期: 2023-09-27 17:59:42

我的数据库模型有问题。我对这件事还很陌生,因此提前表示抱歉。以下是我的自动生成类的样子。。。

会话模型

public partial class Session
{
    public Session()
    {
        this.Tutors = new HashSet<Tutor>();
    }
    public int SessionId { get; set; }
    public int StudentStudentId { get; set; }
    public virtual Student Student { get; set; }
    public virtual ICollection<Tutor> Tutors { get; set; }
}

学生模型

public partial class Student
{
    public Student()
    {
        this.Sessions = new HashSet<Session>();
    }
    public int StudentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Session> Sessions { get; set; }
}

控制器

    public Student Get(int id)
    {
        using(var db = new studytree_dbEntities())
        {
            Student s = db.Students.FirstOrDefault(i => i.StudentId == id);

         return s;
        }
    }

我知道问题出在哪里。数据库从接收数据的学生表中查询。由于它有一个sessionid列,所以它转到会话表并查询会话。但由于这是一对多的关系,会话表有一个学生,因此创建了一个循环。一个学生抓住它的环节,这个环节抓住它的学生等等……我怎么能让它只深入一个层次呢。我想做的是查询一个学生并获取其所有属性。

一对多的循环关系

一种方法是手动具体化学生和她的课程,而不具体化课程的学生参考。此代码假定Tutor不引用任何学生。如果是这样的话,你也需要手动实现Tutor。

using(var db = new studytree_dbEntities())
{
    Student s = db.Students
        .Where(s => s.StudentId == id)
        .ToList()
        .Select(s => new Student {
            FirstName = s.FirstName,
            LastName = s.LastName,
            Sessions = s.Sessions.Select(session => new Session {
                Tutors = session.Tutors
            }),
        })
        .FirstOrDefault();
    return s;
}