C# 层次结构下的对象是否应该引用根?

C# 层次结构下的对象是否应该引用根?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我的堆栈是ASP.NET MVC 5,实体框架6.1,代码优先,SQL Server 我正在处理一个涉及多个学校的申请,每个学校都有课程(每个都有部分)和学生。它们形成了相关对象的层次结构,每个对象都由一个学校实例作为根 到目前为止的基本布局: 一所学校有许多课程和学生 一门课程有许多部分 模型的简化版本如下 public class School { public int Id { get; set; } public string Name { get; set; }

我的堆栈是ASP.NET MVC 5,实体框架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; }
}
注册
实例是学生和课程部分之间的多对多桥梁。获取一个学校的入学列表是多个步骤,需要多个表联接。在一个可能会有大量记录的系统中,我担心这种设置的效率。同样,应用程序被配置为延迟加载,所以也许这没关系,我对EF的了解还不够确定


为了简化数据检索,从
课程部分
入学
模型中的一个或两个模型中引用学校是否理想?进一步扩展,层次结构中的所有模型是否都能够直接引用它们所属的
学校?

否,这将破坏规范化。您的性能问题是有道理的,但解决方案不可能为人所知,也不应该在没有测量实际时间的情况下过早地实施。在我看来,数据是最重要的,因为它很可能比代码寿命长。因此,所有其他条件相同的情况下,数据的良好状态应优先考虑。

这不是一个真正的答案,但“注册”应拼写为“注册”。“注册”也是一样。不是数据库中固有的,但如果添加了一些特定的助手/便利桥,而这些桥不会影响数据库模型和数据库模型的规范化,那么就确定了——如果它使编写和维护此类助手的生活更轻松。但是,不要破坏连接上的SQL效率(已有半个世纪的研究/优化),如果这样做了,请测试这种假设!SQL Server(或任何其他像样的RDBMS)在这种快速收缩的层次结构上的“反向连接”方面非常有效,它可以吃午饭。说到午餐,@haim770加拿大拼写:)@GrantPalin,对不起。
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; }
}