Entity-framework-explicit-loading

提供:Dev Guides
移動先:案内検索

Entity Framework-明示的なロード

遅延読み込みを無効にしても、関連するエンティティを遅延読み込みすることは可能ですが、明示的な呼び出しで行う必要があります。

  • 遅延読み込みとは異なり、クエリが実行されるタイミングに関してあいまいさや混乱の可能性はありません。
  • これを行うには、関連するエンティティのエントリでLoadメソッドを使用します。
  • 1対多の関係の場合は、コレクションでLoadメソッドを呼び出します。
  • また、1対1の関係の場合は、参照でLoadメソッドを呼び出します。

遅延読み込みが無効になっている次の例を見てみましょう。名前がAliの学生が取得されます。

その後、学生情報がコンソールに書き込まれます。 コードを見ると、登録情報も書き込まれますが、登録エンティティはまだロードされていないため、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

理解を深めるために、上記の例を段階的に実行することをお勧めします。