对象组合引用 - 双向?

时间:2011-03-16 18:03:35

标签: c# .net

假设您有一个类对象:

public class Class
{
    IList<Student> students;
}

你有一个学生对象:

public class Student
{
    private Class class;
}

从数据库加载这些对象时,加载关联的最佳方法是什么?

加载课程时,您将有一个空的学生列表。如果先加载学生,则在加载类之前,将对类对象进行空引用。

2 个答案:

答案 0 :(得分:2)

这是我一直在努力解决的问题之一。我提出的最优雅的方法(到目前为止)是简单地为我处理所有这些的对象创建属性。

最终,它归结为您正在使用这些课程的情况。例如,在成绩簿应用程序中,您可以深入了解课程和学生记录。另一方面,如果您正在进行课程注册申请,您将有学生加入课程,并从学生深入了解他们注册的课程。

由于我们没有您正在讨论的应用程序的实际范围,我们只需滚动通用样式,不是吗?这是一堂课'经典班级。 (啊,这很有趣。)然而,相同的想法将适用于Student课程。

public class Class
{
    IList<Student> _students;
    public IList<Student> Students
    {
        get
        {
            if(_students == null)
            {
                _students = new IList<Student>();
                PopulateStudents(); // just for simplicity
            }
        }
        // no need for a setter usually... Use Students.Add(Student s)
    }
}

这允许您做的是按需加载这个特定班级的学生。假设这是用于Web开发,如果您的应用程序正在查看有关类的信息,但现在不需要学生列表,为什么要从数据库中提取它? PopulateStudents()可以像你一样复杂。至少你会把数据库调用放在那里,但在那里抛出一些缓存并不是一个坏主意。

如果你做得恰当,你不必担心加载对象的顺序。当您需要/需要它们时,它们都会被加载,并且您不需要考虑您的消费代码。当你打电话

Class c = new Class(id); // You do need a class to get its students...
IList<Students> studentList = c.Students;

你真的不知道你的数据是否已被拉动,或者仍然需要拉动,或者是什么 - 你关心什么?让班级本身处理细节。

当然,需要考虑一下你需要解决的问题。例如,“新”类(换句话说,不在数据库中的类还是)。然而,通过一些彻底的编程,最终结果是相同的。

答案 1 :(得分:1)

  

从数据库加载这些对象时,加载关联的最佳方法是什么?

如果您正在使用ORM,只需让延迟加载功能处理它。请注意选择n + 1问题。

如果您没有使用ORM,请开始使用ORM。