Entity Framework - วงจรชีวิต

อายุการใช้งาน

อายุการใช้งานของบริบทเริ่มต้นเมื่ออินสแตนซ์ถูกสร้างขึ้นและสิ้นสุดลงเมื่ออินสแตนซ์ถูกกำจัดหรือรวบรวมขยะ

  • อายุการใช้งานตามบริบทเป็นการตัดสินใจที่สำคัญมากเมื่อเราใช้ ORM

  • บริบททำงานเหมือนเอนทิตีแคชดังนั้นจึงหมายถึงมีการอ้างอิงถึงเอนทิตีที่โหลดทั้งหมดซึ่งอาจเติบโตเร็วมากในการใช้หน่วยความจำและยังทำให้หน่วยความจำรั่วไหล

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

วงจรชีวิตของเอนทิตี

Entity Lifecycle อธิบายกระบวนการที่เอนทิตีถูกสร้างเพิ่มแก้ไขลบ ฯลฯ เอนทิตีมีหลายสถานะในช่วงอายุการใช้งาน ก่อนที่จะดูวิธีการดึงสถานะเอนทิตีมาดูกันว่าสถานะเอนทิตีคืออะไร รัฐเป็นประเภท enumSystem.Data.EntityState ที่ประกาศค่าต่อไปนี้ -

  • Added: นิติบุคคลถูกทำเครื่องหมายว่าเพิ่มแล้ว

  • Deleted: นิติบุคคลถูกทำเครื่องหมายว่าลบแล้ว

  • Modified: มีการแก้ไขเอนทิตี

  • Unchanged: ไม่ได้แก้ไขเอนทิตี

  • Detached: ไม่ได้ติดตามเอนทิตี

การเปลี่ยนแปลงสถานะในวงจรชีวิตของเอนทิตี

บางครั้งสถานะของเอนทิตีจะถูกกำหนดโดยบริบทโดยอัตโนมัติ แต่ผู้พัฒนายังสามารถแก้ไขได้ด้วยตนเอง แม้ว่าการรวมสวิตช์ทั้งหมดจากสถานะหนึ่งไปยังอีกสถานะหนึ่งจะเป็นไปได้ แต่บางส่วนก็ไม่มีความหมาย ตัวอย่างเช่น,Added เอนทิตีให้กับ Deleted รัฐหรือในทางกลับกัน

มาพูดคุยเกี่ยวกับสถานะต่างๆกัน

สถานะไม่เปลี่ยนแปลง

  • เมื่อเอนทิตีไม่มีการเปลี่ยนแปลงจะถูกผูกไว้กับบริบท แต่ไม่ได้รับการแก้ไข

  • โดยค่าเริ่มต้นเอนทิตีที่ดึงมาจากฐานข้อมูลจะอยู่ในสถานะนี้

  • เมื่อเอนทิตีแนบกับบริบท (ด้วยวิธีการแนบ) เอนทิตีจะอยู่ในสถานะไม่เปลี่ยนแปลงในทำนองเดียวกัน

  • บริบทไม่สามารถติดตามการเปลี่ยนแปลงของออบเจ็กต์ที่ไม่ได้อ้างอิงดังนั้นเมื่อแนบมาแล้วจะถือว่าไม่มีการเปลี่ยนแปลง

สถานะแยก

  • แยกออกเป็นสถานะเริ่มต้นของเอนทิตีที่สร้างขึ้นใหม่เนื่องจากบริบทไม่สามารถติดตามการสร้างวัตถุใด ๆ ในโค้ดของคุณ

  • สิ่งนี้เป็นจริงแม้ว่าคุณจะสร้างอินสแตนซ์เอนทิตีภายในบล็อกโดยใช้บริบท

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

  • เมื่อแยกเอนทิตีออกจะไม่ถูกผูกไว้กับบริบทดังนั้นสถานะจึงไม่ถูกติดตาม

  • สามารถกำจัดแก้ไขใช้ร่วมกับคลาสอื่น ๆ หรือใช้ในลักษณะอื่นที่คุณอาจต้องการ

  • เนื่องจากไม่มีการติดตามบริบทจึงไม่มีความหมายกับ Entity Framework

เพิ่มรัฐ

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

  • โดยปกติแล้วแม้ว่าคุณจะปรับเปลี่ยนคุณสมบัติบางอย่างสถานะจะยังคงถูกเพิ่มเนื่องจากการย้ายไปที่ Modified, Unchanged หรือ Deleted นั้นไม่มีเหตุผล

  • เป็นเอนทิตีใหม่และไม่มีความสอดคล้องกับแถวในฐานข้อมูล

  • นี่เป็นข้อกำหนดเบื้องต้นพื้นฐานสำหรับการอยู่ในสถานะใดสถานะหนึ่ง (แต่บริบทนี้ไม่ได้บังคับใช้)

สถานะที่แก้ไข

  • เมื่อเอนทิตีถูกแก้ไขนั่นหมายความว่าอยู่ในสถานะไม่เปลี่ยนแปลงจากนั้นคุณสมบัติบางอย่างก็เปลี่ยนไป

  • หลังจากเอนทิตีเข้าสู่สถานะ Modified เอนทิตีสามารถย้ายไปยังสถานะแยกออกหรือถูกลบได้ แต่จะไม่สามารถย้อนกลับไปสู่สถานะไม่เปลี่ยนแปลงแม้ว่าคุณจะกู้คืนค่าดั้งเดิมด้วยตนเองก็ตาม

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

สถานะที่ถูกลบ

  • เอนทิตีเข้าสู่สถานะที่ถูกลบเนื่องจากไม่มีการเปลี่ยนแปลงหรือแก้ไขจากนั้นจึงใช้เมธอด DeleteObject

  • นี่เป็นสถานะที่ จำกัด มากที่สุดเนื่องจากไม่มีจุดหมายเปลี่ยนจากสถานะนี้ไปเป็นค่าอื่น แต่ถูกแยกออก

usingคำสั่งถ้าคุณต้องการให้ทรัพยากรทั้งหมดที่บริบทควบคุมถูกกำจัดเมื่อสิ้นสุดบล็อก เมื่อคุณใช้ไฟล์using จากนั้นคอมไพเลอร์จะสร้าง try / ปิดกั้นโดยอัตโนมัติและเรียกว่า dispose ในบล็อกสุดท้าย

using (var context = new UniContext()) {

   var student = new Student {
      LastName = "Khan", 
      FirstMidName = "Ali", 
      EnrollmentDate = DateTime.Parse("2005-09-01")
   };

   context.Students.Add(student);
   context.SaveChanges();
}

เมื่อทำงานกับบริบทที่ใช้งานมายาวนานให้พิจารณาสิ่งต่อไปนี้ -

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

  • อย่าลืมทิ้งบริบทเมื่อไม่จำเป็นต้องใช้อีกต่อไป

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

  • โอกาสที่จะพบปัญหาที่เกี่ยวข้องกับภาวะพร้อมกันเพิ่มขึ้นเมื่อช่องว่างระหว่างเวลาที่ข้อมูลถูกสอบถามและอัปเดตเพิ่มขึ้น

  • เมื่อทำงานกับเว็บแอปพลิเคชันให้ใช้อินสแตนซ์บริบทต่อคำขอ

  • เมื่อทำงานกับ Windows Presentation Foundation (WPF) หรือ Windows Forms ให้ใช้อินสแตนซ์บริบทต่อฟอร์ม ซึ่งช่วยให้คุณใช้ฟังก์ชันการติดตามการเปลี่ยนแปลงที่บริบทมีให้

กฎของ Thumb

Web Applications

  • ปัจจุบันเป็นแนวทางปฏิบัติทั่วไปและเป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้งานเว็บบริบทจะถูกใช้ต่อคำขอ

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

Desktop Applications

  • สำหรับแอปพลิเคชันเดสก์ท็อปเช่น Win Forms / WPF เป็นต้นบริบทจะถูกใช้ต่อแบบฟอร์ม / โต้ตอบ / เพจ

  • เนื่องจากเราไม่ต้องการให้บริบทเป็นซิงเกิลตันสำหรับแอปพลิเคชันของเราเราจะกำจัดทิ้งเมื่อเราย้ายจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง

  • ด้วยวิธีนี้เราจะได้รับความสามารถของบริบทมากมายและจะไม่ต้องทนทุกข์ทรมานจากผลกระทบของบริบทที่ใช้งานมายาวนาน