エンティティフレームワーク-明示的な読み込み
遅延読み込みを無効にしても、関連するエンティティを遅延読み込みすることは可能ですが、明示的な呼び出しで行う必要があります。
遅延読み込みとは異なり、クエリがいつ実行されるかに関してあいまいさや混乱の可能性はありません。
これを行うには、関連するエンティティのエントリでLoadメソッドを使用します。
1対多の関係の場合は、コレクションでLoadメソッドを呼び出します。
また、1対1の関係の場合は、参照でLoadメソッドを呼び出します。
遅延読み込みが無効になっている次の例を見てみましょう。次に、名がAliである学生が取得されます。
その後、学生情報がコンソールに書き込まれます。コードを見ると、登録情報も書き込まれていますが、Enrollmentsエンティティはまだロードされていないため、foreachループは実行されません。
その後、Enrollmentsエンティティが明示的にロードされ、学生情報と登録情報がコンソールウィンドウに書き込まれます。
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
context.Configuration.LazyLoadingEnabled = false;
var student = (from s in context.Students where s.FirstMidName ==
"Ali" select s).FirstOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
enrollment.EnrollmentID, enrollment.CourseID);
}
Console.WriteLine();
Console.WriteLine("Explicitly loaded Enrollments");
Console.WriteLine();
context.Entry(student).Collection(s ⇒ s.Enrollments).Load();
Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
enrollment.EnrollmentID, enrollment.CourseID);
}
Console.ReadKey();
}
}
}
上記の例を実行すると、次の出力が表示されます。最初に学生情報のみが表示され、登録エンティティを明示的にロードした後、学生とその関連する登録情報の両方が表示されます。
ID: 1, Name: Ali Alexander
Explicitly loaded Enrollments
ID: 1, Name: Ali Alexander
Enrollment ID: 1, Course ID: 1050
Enrollment ID: 2, Course ID: 4022
Enrollment ID: 3, Course ID: 4041
理解を深めるために、上記の例を段階的に実行することをお勧めします。