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 เป็นต้นบริบทจะถูกใช้ต่อแบบฟอร์ม / โต้ตอบ / เพจ
เนื่องจากเราไม่ต้องการให้บริบทเป็นซิงเกิลตันสำหรับแอปพลิเคชันของเราเราจะกำจัดทิ้งเมื่อเราย้ายจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง
ด้วยวิธีนี้เราจะได้รับความสามารถของบริบทมากมายและจะไม่ต้องทนทุกข์ทรมานจากผลกระทบของบริบทที่ใช้งานมายาวนาน