Reading Related Data with the Entity Framework

Lazy, Eagerly, and Explicit Loading of Related Data

SheenA
Entity Framework
Published in
2 min readAug 22, 2013

--

มีหลายวิธีที่จะใช้ Entity Framework ในการโหลดข้อมูลที่มีความสัมพันธ์กัน โดยอาศัย Navigation Properties ของเอนติตี้

1.Lazy loading. เมื่อเอนติตี้ถูกอ่านครั้งแรกข้อมูลที่มีความสัมพันธ์กัน( Navigation Properties)จะยังไม่ถูกดึงเข้ามา แต่เมื่อใดก็ตามที่คุณต้องการข้อมูลที่ถูกระบุไว้จาก Navigation Properties ก็จะถูกดึงขึ้นมาในทันที. ผลลัพธ์ที่ได้จะเกิดคำสั่งหลายๆคำสั่งถูกส่งไปที่ฐานข้อมูล — หนึ่งคือมีเอนติตี้ที่ถูกเรียก และในการเรียกแต่ละครั้งก็จะมีการเรียกข้อมูลที่สัมพันธ์กันของเอนติตี้มาด้วย.

Lazy Loading Example

2.Eagerly loading. เมื่อเอนติตี้ถูกอ่านข้อมูลที่สัมพันธ์กันทั้งหมดจะถูกดึงมาไว้ทันที,ในลักษณะนี้จะส่งผลให้เกิดการดึงข้อมูลทั้งหมดที่ต้องการมาในครั้งเดียว. คุณสามารถใช้วิธีการนี้ได้ด้วยคำสั่ง Include.

Eagerly Loading Example

3.Explicit loading. วิธีนี้คล้ายกับแบบแรกยกเว้นว่าคุณต้องทำการดึงข้อมูลที่สัมพันธ์กันด้วยการเขียนคำสั่งเอง, วิธีนี้จะไม่มีการดึงข้อมูลให้อัตโนมัติแม้ว่าคุณจะอ้างถึง Navigation property. คุณต้องทำการโหลดข้อมูลเหล่านี้ด้วยตัวเองโดยใช้ Object state manager เพื่อเข้าถึงเอนติตี้และเรียกใช้เมธอด Collection.Load ในการเรียกชุดข้อมูล หรือใช้เมธอด Reference.Load ในการเรียกข้อมูลตัวเดียว. (จากตัวอย่าง, ถ้าคุณต้องการโหลดข้อมูลจาก Navigation property, ให้เปลี่ยนจาก Collection(x => x.Employees) เป็น Reference(x => x.Employees).)

Explicit Loading Example

เพราะเหตุที่ว่าไม่มีการดึงเรียกข้อมูลมาทันทีนี้เอง ทำให้ทั้ง Lazy Load และ Explicit Load บางครั้งก็ถูกเรียกว่า Deferred Loading

โดยปกติแล้ว หากคุณรู้ว่าคุณต้องการข้อมูลที่สัมพันธ์กันทั้งหมดของเอนติตี้ Eagerly Load อาจเป็นวิธีที่ดีที่สุดเพราะเป็นการส่งคำสั่งในการดึงข้อมูลในครั้งเดียวไปที่ฐานข้อมูลซึ่งดีกว่าการเรียกข้อมูลหลายๆรอบในแต่ละครั้ง , จากตัวอย่างที่กล่าวมา, สมมุติว่าแต่ละแผนกมีพนักงานอยู่ 10 คน , Eagerly Load จะทำการดึงข้อมูลทั้งหมดมาในครั้งเดียว ส่วน Lazy Load และ Explicit จะต้องดึงข้อมูลทั้งหมดถึง 11 ครั้ง. ยิ่งไปกว่านั้นจะส่งผลต่อประสิทธิภาพ ทำให้ความเร็วในการเข้าถึงข้อมูลลดลง.

อีกด้านนึง ในบางเหตุการณ์ Lazy loading ก็มีประสิทธิภาพมากกว่า. เนื่องจาก Eager loading ในบางครั้งจะมีการสร้างคำสั่งที่ซับซ้อนเกินไป เป็นผลให้ SQL Server ไม่สามารถทำงานได้อย่างมีประสิทธิภาพ. หรือบางครั้งหากคุณต้องการเรียกเอนติตี้เพียงบางส่วนของ Navigation properties , Lazy loading อาจจะเป็นทางเลือกที่ดีกว่าเพราะ Eager loading จะทำการดึงข้อมูลมามากกว่าที่คุณต้องการ. ในกรณีที่ประสิทธิภาพในการทำงานเป็นเรื่องจำเป็น,วิธีที่ดีที่สุดคือให้ทำการทดสอบประสิทธิภาพของทั้งสองวิธี.

--

--

SheenA
Entity Framework

I have no idea...Application Developer/IT/Social/Politics/Philosophy/Ecotourism...& Blah Blah Blah