一对多的循环关系
本文关键字:关系 循环 一对多 | 更新日期: 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;
}