Entity Framework - เอนทิตีที่ไม่ได้เชื่อมต่อ

ในบทนี้ให้เราดูวิธีการเปลี่ยนแปลงเอนทิตีที่บริบทไม่ถูกติดตาม เอนทิตีที่ไม่ได้ถูกติดตามโดยบริบทเรียกว่าเอนทิตี 'ไม่เชื่อมต่อ'

  • สำหรับแอปพลิเคชันระดับเดียวส่วนใหญ่ที่อินเทอร์เฟซผู้ใช้และเลเยอร์การเข้าถึงฐานข้อมูลทำงานในกระบวนการแอปพลิเคชันเดียวกันคุณอาจจะดำเนินการกับเอนทิตีที่ถูกติดตามโดยบริบท

  • การดำเนินการกับเอนทิตีที่ไม่ได้เชื่อมต่อนั้นพบได้บ่อยในแอปพลิเคชัน N-Tier

  • แอปพลิเคชัน N-Tier เกี่ยวข้องกับการดึงข้อมูลบางอย่างบนเซิร์ฟเวอร์และส่งคืนผ่านเครือข่ายไปยังเครื่องไคลเอนต์

  • จากนั้นไคลเอนต์แอปพลิเคชันจะจัดการข้อมูลนี้ก่อนที่จะส่งคืนไปยังเซิร์ฟเวอร์เพื่อคงอยู่

ต่อไปนี้เป็นสองขั้นตอนที่ต้องดำเนินการกับกราฟเอนทิตีที่ถูกตัดการเชื่อมต่อหรือแม้แต่เอนทิตีที่ถูกตัดการเชื่อมต่อเดียว

  • แนบเอนทิตีด้วยอินสแตนซ์บริบทใหม่และทำให้บริบททราบเกี่ยวกับเอนทิตีเหล่านี้

  • ตั้งค่า EntityStates ที่เหมาะสมให้กับเอนทิตีเหล่านี้ด้วยตนเอง

มาดูโค้ดต่อไปนี้ซึ่งมีการเพิ่มเอนทิตีนักศึกษาด้วยเอนทิตีการลงทะเบียนสองเอนทิตี

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 ใหม่ซึ่งอ้างอิงอินสแตนซ์การลงทะเบียนใหม่สองอินสแตนซ์ในคุณสมบัติการลงทะเบียน

  • จากนั้นนักเรียนใหม่จะถูกเพิ่มลงในบริบทโดยใช้วิธีการเพิ่ม

  • เมื่อเพิ่ม Student แล้วโค้ดจะใช้เมธอด DbContext.Entry เพื่อเข้าถึงข้อมูลการติดตามการเปลี่ยนแปลงที่ Entity Framework มีเกี่ยวกับ Student ใหม่

  • จากข้อมูลการติดตามการเปลี่ยนแปลงนี้คุณสมบัติของรัฐจะใช้เพื่อเขียนสถานะปัจจุบันของเอนทิตี

  • จากนั้นกระบวนการนี้จะทำซ้ำสำหรับการลงทะเบียนที่สร้างขึ้นใหม่แต่ละรายการที่อ้างอิงจากนักเรียนใหม่ หากคุณเรียกใช้แอปพลิเคชันคุณจะได้รับผลลัพธ์ต่อไปนี้ -

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 เกี่ยวกับเอนทิตีที่มีอยู่ วิธีการแนบจะทำเครื่องหมายเอนทิตีในสถานะไม่เปลี่ยนแปลง

ลองดูรหัส C # ต่อไปนี้ที่แนบเอนทิตีที่ไม่ได้เชื่อมต่อกับ DbContext

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...