- การรวมการเชื่อมต่อได้รับการจัดการเช่นเดียวกับในแอปพลิเคชัน ADO.NET อื่น ๆ การเชื่อมต่อเอนทิตียังคงใช้การเชื่อมต่อฐานข้อมูลดั้งเดิมกับสตริงการเชื่อมต่อดั้งเดิม ฉันเชื่อว่าคุณสามารถปิดการเชื่อมต่อร่วมกันในสตริงการเชื่อมต่อหากคุณไม่ต้องการใช้ (อ่านเพิ่มเติมเกี่ยวกับSQL Server Connection Pooling (ADO.NET )
- ไม่เคยใช้บริบททั่วโลก ObjectContext ใช้รูปแบบหลายอย่างภายในรวมถึง Identity Map และ Unit of Work ผลกระทบของการใช้บริบทโลกแตกต่างกันตามประเภทของแอปพลิเคชัน
- สำหรับเว็บแอปพลิเคชันให้ใช้บริบทเดียวต่อคำขอ สำหรับบริการเว็บใช้บริบทเดียวต่อการโทร ใน WinForms หรือแอปพลิเคชัน WPF ใช้บริบทเดียวต่อแบบฟอร์มหรือต่อผู้นำเสนอ อาจมีข้อกำหนดพิเศษบางอย่างที่ไม่อนุญาตให้ใช้วิธีนี้ แต่ในสถานการณ์ส่วนใหญ่ก็เพียงพอแล้ว
หากคุณต้องการที่จะรู้ว่าผลกระทบมีบริบทวัตถุเดียวสำหรับการประยุกต์ใช้ WPF / WinForm ตรวจสอบบทความ มันเกี่ยวกับ NHibernate Session แต่ความคิดก็เหมือนกัน
แก้ไข:
เมื่อคุณใช้ EF โดยค่าเริ่มต้นจะโหลดแต่ละเอนทิตีเพียงครั้งเดียวต่อบริบท แบบสอบถามแรกสร้างเอนทิตี้ของและเก็บไว้ภายใน คิวรีใด ๆ ที่ตามมาซึ่งต้องการเอนทิตีที่มีคีย์เดียวกันจะส่งคืนอินสแตนซ์ที่เก็บไว้นี้ หากค่าในแหล่งข้อมูลเปลี่ยนไปคุณยังคงได้รับเอนทิตีที่มีค่าจากคิวรีเริ่มต้น นี้เรียกว่าเอกลักษณ์รูปแบบแผนที่ คุณสามารถบังคับให้บริบทวัตถุโหลดเอนทิตี้ได้ แต่จะโหลดซ้ำอินสแตนซ์ที่แชร์เพียงครั้งเดียว
การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับเอนทิตีจะไม่คงอยู่จนกว่าคุณจะโทรหาSaveChanges
บริบท คุณสามารถทำการเปลี่ยนแปลงในหลายเอนทิตีและจัดเก็บได้ทันที นี้เรียกว่าหน่วยของรูปแบบการทำงาน คุณไม่สามารถเลือกได้ว่าต้องการแนบไฟล์เอนทิตีที่แก้ไขหรือไม่
รวมสองรูปแบบเหล่านี้แล้วคุณจะเห็นเอฟเฟกต์ที่น่าสนใจ คุณมีเอนทิตี้ของอินสแตนซ์เดียวเท่านั้นสำหรับแอปพลิเคชันทั้งหมด การเปลี่ยนแปลงใด ๆ ต่อเอนทิตีจะมีผลกับแอปพลิเคชั่นทั้งหมดแม้ว่าจะยังไม่มีการเปลี่ยนแปลง (ยืนยัน) ในเวลาส่วนใหญ่นี่ไม่ใช่สิ่งที่คุณต้องการ สมมติว่าคุณมีแบบฟอร์มแก้ไขในแอ็พพลิเคชัน WPF คุณกำลังทำงานกับเอนทิตีและคุณตัดสินใจที่จะยกเลิกการแก้ไขที่ซับซ้อน (การเปลี่ยนแปลงค่าเพิ่มเอนทิตีที่เกี่ยวข้องลบเอนทิตีที่เกี่ยวข้องอื่น ๆ ฯลฯ ) แต่เอนทิตีถูกแก้ไขแล้วในบริบทที่ใช้ร่วมกัน คุณจะทำอะไร? คำแนะนำ: ผมไม่ทราบเกี่ยวกับ CancelChanges ใด ๆ หรือ UndoChanges ObjectContext
บน
ฉันคิดว่าเราไม่ต้องพูดคุยเรื่องเซิร์ฟเวอร์ เพียงแบ่งปันเอนทิตีเดียวระหว่างการร้องขอ HTTP หลายครั้งหรือการเรียกบริการบนเว็บทำให้แอปพลิเคชันของคุณไร้ประโยชน์ คำขอใด ๆ ก็สามารถทริกเกอร์SaveChanges
และบันทึกข้อมูลบางส่วนจากคำขออื่นได้เนื่องจากคุณแบ่งปันหน่วยงานเดียวในหมู่พวกเขาทั้งหมด สิ่งนี้จะมีปัญหาอื่น - บริบทและการจัดการใด ๆ กับเอนทิตีในบริบทหรือการเชื่อมต่อฐานข้อมูลที่ใช้โดยบริบทนั้นไม่ปลอดภัยเธรด
แม้แต่แอปพลิเคชันแบบอ่านอย่างเดียวบริบททั่วโลกไม่ใช่ตัวเลือกที่ดีเพราะคุณอาจต้องการข้อมูลใหม่ทุกครั้งที่คุณค้นหาแอปพลิเคชัน