Entity Framework: จะปิดใช้งานการโหลดแบบขี้เกียจสำหรับแบบสอบถามเฉพาะได้อย่างไร


89

มีวิธีใดบ้างในการปิดใช้งานการโหลดแบบขี้เกียจสำหรับแบบสอบถามเฉพาะใน Entity Framework 6 ฉันต้องการใช้เป็นประจำ แต่บางครั้งฉันต้องการปิดการใช้งาน ฉันใช้คุณสมบัติเสมือนเพื่อขี้เกียจโหลด


20
ตั้งค่า context.Configuration.LazyLoadingEnabled = false; ก่อนข้อความค้นหาที่คุณต้องการเรียกใช้
Karthik Ganesan

5
คุณสามารถตั้งค่าthis.Configuration.LazyLoadingEnabled = false;แล้วตั้งค่าอีกครั้งthis.Configuration.LazyLoadingEnabled = true;? นอกจากนี้คุณสามารถอ่านmsdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
ขอบคุณ @KarthikGanesan มันทำงานได้ตามที่คาดไว้
Marco Alves

@KarthikGanesan ใส่ความคิดเห็นเป็นคำตอบได้ไหม? มันใช้งานได้ดีจริงๆ :)
Sampath

1
เพิ่มความคิดเห็นเป็นคำตอบ @Sampath
Karthik Ganesan

คำตอบ:


76

ตั้งรหัสต่อไปนี้ก่อนแบบสอบถามที่คุณต้องการดำเนินการ

context.Configuration.LazyLoadingEnabled = false;

40

คุณสามารถปิดใช้งานการโหลด Lazy สำหรับข้อความค้นหาเฉพาะดังนี้:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

21

ฉันอาจจะขาดอะไรบางอย่างที่นี่ แต่แทนที่จะเปลี่ยนการกำหนดค่าทุกครั้งวิธีอื่นอาจใช้.Include()กับคำค้นหาที่คุณต้องการโหลดเท่านั้นหรือไม่

สมมติว่าเรามีProductคลาสที่มีคุณสมบัติการนำทางไปยังColourคลาสคุณอาจโหลดColourสิ่งProductนี้ -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
สำหรับฉันนี่คือคำตอบที่ดีที่สุดที่นี่!
เอียน

สิ่งนี้จะสั้นหากคุณต้องการเพียงแค่โหลด "ผลิตภัณฑ์" โดยไม่รวมใด ๆ
Mackan

คุณต้องการรับ 'ผลิตภัณฑ์' โดยไม่มีวัตถุที่เกี่ยวข้องหรือ 'ผลิตภัณฑ์ที่มีวัตถุที่เกี่ยวข้องทั้งหมด?'
Parrybird

1
คำตอบที่มีประโยชน์มากขึ้น สิ่งนี้ควบคุมตารางการจัดลำดับย่อยเฉพาะที่โหลด ณ จุดที่กำลังสร้างแบบสอบถาม สำหรับปัญหาในโลกแห่งความเป็นจริงสิ่งนี้จะต้องเป็นหนทางไป
Richard Petheram

5
มันมีประโยชน์ในทางที่แตกต่างออกไป ... ถ้าคุณทำแบบนี้อาจมีคนขี้เกียจโหลดสำหรับคอลเลกชันอื่นจาก 'ผลิตภัณฑ์' การปิดใช้งานการโหลดแบบขี้เกียจจะมีประสิทธิภาพมากกว่าเพื่อรับประกันว่าข้อมูลทั้งหมดที่จำเป็นจะถูกดึงมาล่วงหน้าและหลีกเลี่ยงการสร้างคอขวดด้านประสิทธิภาพที่ซ่อนอยู่
ดั๊ก

15

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

หากคุณใช้รหัสก่อนให้ไปที่พื้นที่กำหนดค่าของคุณและปิดการใช้งานจากที่นั่นด้วย:

this.Configuration.LazyLoadingEnabled = false;

6
ผู้คนจำนวนมากกำลังเยี่ยมชมคำถามนี้และฉันอยากจะบอกว่าผู้คนไม่ควรเขียนคำถามโดยไม่ได้ดูแผนการดำเนินการ รู้เสมอว่ารหัสของคุณส่งไปยังฐานข้อมูลอะไรมิฉะนั้นคุณจะมีปัญหาด้านประสิทธิภาพ คุณสามารถใช้ linq pad หรือเครื่องมืออื่น ๆ เพื่อดูแบบสอบถามจริงและตรวจสอบ
ฮวน


3

แนวทางอื่นสำหรับเวอร์ชัน EF อื่น (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

เมื่อcontextเป็นที่บรรพบุรุษมากหรือน้อยเลิกของเสื้อคลุมของตนObjectContext DbContext
Gert Arnold

2

สมมติว่าคุณมีสิ่งนี้:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

คุณยังคงขี้เกียจโหลดแม้ว่าจะมีการตั้งค่าที่ชัดเจนว่าจะไม่ทำก็ตาม การแก้ไขทำได้ง่ายเปลี่ยนเป็นสิ่งนี้:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.