假设您有一个类对象:
public class Class
{
IList<Student> students;
}
你有一个学生对象:
public class Student
{
private Class class;
}
从数据库加载这些对象时,加载关联的最佳方法是什么?
加载课程时,您将有一个空的学生列表。如果先加载学生,则在加载类之前,将对类对象进行空引用。
答案 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。