层次结构中的对象是否应该引用根?

时间:2014-08-31 18:46:43

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

我的堆栈是ASP.NET MVC 5,Entity Framework 6.1,代码优先,SQL Server。

我正在申请一个涉及多所学校的申请,每所学校都有课程(每个都有部分)和学生。这些形成了相关对象的层次结构,每个对象都由一个学校实例生成。

到目前为止的基本布局:
一所学校有很多课程和学生 一门课程有很多部分

模型的简化版本如下。

public class School
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Course> Courses { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

public class Student
{
    public int Id { get; set; }

    public int SchoolId { get; set; }

    public virtual School School { get; set; }

    public virtual ICollection<Enrolment> Enrolments { get; set; }
}

public class Course
{
    public int Id { get; set; }

    public string Title { get; set; }

    public int SchoolId { get; set; }

    public virtual School School { get; set; }

    public virtual ICollection<CourseSection> CourseSections { get; set; }
}

public class CourseSection
{
    public int Id { get; set; }

    public int CourseId { get; set; }

    public virtual Course Course { get; set; }

    public virtual ICollection<Enrolment> Enrolments { get; set; }
}

还涉及其他模型和关系,但这应该足以构成我的问题的基础。

课程部分与课程有关,而课程又与学校有关。鉴于课程部分,我可以确定它所属的学校,例如var school = givenSection.Course.School。相反,考虑到学校,我可以获得属于学校的课程部分。在代码中,它只是几个引用,而在数据库中,它只是几个表连接。但它仍然变得更有趣。考虑下一个模型:

public class Enrolment
{
    public int Id { get; set; }

    public int StudentId { get; set; }

    public int CourseSectionId { get; set; }

    public virtual Student Student { get; set; }

    public virtual CourseSection CourseSection { get; set; }
}

Enrolment实例是学生和课程部分之间的多对多桥梁。获取学校的注册列表是需要多个表连接的多个步骤。在一个可能变得非常大的记录数量的系统中,我担心这种设置的效率。然后再次,应用程序配置为延迟加载,所以也许这样可以,我还不太了解EF确定。

为了简化数据检索,从CourseSectionEnrolment模型中的任何一个或两者引用学校可能是理想的吗?如果层次结构中的所有模型都能够直接引用它们所属的School,那么进一步扩展它吗?

1 个答案:

答案 0 :(得分:0)

不,这会破坏正常化。您的性能问题是有效的,但解决方案无法知晓,不应过早实施,也不能在不测量实际时间的情况下实施。在我看来,数据是最重要的,因为它可能会比代码更长久。因此,所有其他与数据良好形状相同的应该是优先考虑的事项。