循环关系一对多

时间:2014-04-23 14:28:49

标签: c# asp.net entity-framework one-to-many circular-reference

我的数据库模型存在问题。我对此很新,因此提前抱歉。以下是我自动生成的类的外观......

会话模型

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列,因此会转到会话表并查询会话。但由于它是一对多关系,因此会话表有一个学生,因此创建了一个循环。一个学生抓住它会话,会话抓住它的学生等......我怎样才能使它只有一个深度。我想要做的是查询学生并获得其所有属性。

1 个答案:

答案 0 :(得分:0)

一种方法是手动实现学生及其课程,而不会实现会话的学生参考。此代码假定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;
}
相关问题