Entity-framework-disconnected-entities

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

Entity Framework-切断されたエンティティ

この章では、コンテキストによって追跡されていないエンティティに変更を加える方法を見てみましょう。 コンテキストによって追跡されていないエンティティは、「切断された」エンティティと呼ばれます。

  • ユーザーインターフェイスとデータベースアクセスレイヤーが同じアプリケーションプロセスで実行されるほとんどの単層アプリケーションでは、おそらくコンテキストによって追跡されているエンティティに対して操作を実行するだけです。
  • 切断されたエンティティに対する操作は、N層アプリケーションでより一般的です。
  • N層アプリケーションでは、サーバー上の一部のデータを取得し、それをネットワーク経由でクライアントマシンに返します。
  • その後、クライアントアプリケーションはこのデータを操作してから、サーバーに戻して永続化します。

以下は、切断されたエンティティグラフまたは単一の切断されたエンティティで実行する必要がある2つのステップです。

  • エンティティを新しいコンテキストインスタンスに接続し、これらのエンティティに関するコンテキストを認識させます。
  • 適切なEntityStatesをこれらのエンティティに手動で設定します。

エンティティに変更

Studentエンティティが2つのEnrollmentエンティティに追加されている次のコードを見てみましょう。

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",

         EnrollmentDate = DateTime.Parse("2015-10-10"),
            Enrollments = new List<Enrollment> {

               new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
               new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
         }
      };

      using (var context = new UniContextEntities()) {

         context.Students.Add(student);
         Console.WriteLine("New Student ({0} {1}): {2}",
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}",
               enrollment.EnrollmentID, context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   }
}
  • このコードは、新しいStudentインスタンスを作成します。このインスタンスは、Enrollmentsプロパティで2つの新しいEnrollmentインスタンスも参照します。
  • 次に、Addメソッドを使用して、新しい生徒がコンテキストに追加されます。
  • 生徒が追加されると、コードはDbContext.Entryメソッドを使用して、Entity Frameworkが新しい生徒について持っている変更追跡情報にアクセスします。
  • この変更追跡情報から、Stateプロパティを使用してエンティティの現在の状態を書き出します。
  • このプロセスは、新しい生徒から参照される新しく作成された登録ごとに繰り返されます。 あなたがアプリケーションを実行すると、次の出力が表示されます-
New Student   (Wasim  Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...

DbSet.AddはEntity Frameworkに新しいエンティティを通知するために使用されますが、DbSet.AttachはEntity Frameworkに既存のエンティティを通知するために使用されます。 Attachメソッドは、エンティティをUnchanged状態にマークします。

切断されたエンティティがDbContextでアタッチされている次のC#コードを見てみましょう。

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",
         EnrollmentDate = DateTime.Parse("2015-10-10"),

         Enrollments = new List<Enrollment> {
            new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
            new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
         }

      };

      using (var context = new UniContextEntities()) {

         context.Students.Attach(student);
         Console.WriteLine("New Student ({0} {1}): {2}",
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID,
               context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   }
}

上記のコードがAttach()メソッドで実行されると、次の出力が表示されます。

New Student   (Wasim  Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...