Kerangka Kerja Entitas: Bagaimana cara menonaktifkan pemuatan lambat untuk kueri tertentu?


89

Apakah ada cara untuk menonaktifkan pemuatan lambat untuk kueri tertentu di Entity Framework 6? Saya ingin menggunakannya secara teratur, tetapi terkadang saya ingin menonaktifkannya. Saya menggunakan properti virtual untuk memuatnya secara lambat.


20
setel context.Configuration.LazyLoadingEnabled = false; sebelum kueri yang ingin Anda jalankan
Karthik Ganesan

5
Anda bisa menyetel nilainya this.Configuration.LazyLoadingEnabled = false;, lalu menyetelnya lagi this.Configuration.LazyLoadingEnabled = true;? Juga, Anda dapat membaca msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
terima kasih @kikikesan. Ini bekerja seperti yang diharapkan.
Marco Alves

@KikGesanBisakah Anda memberikan komentar Anda sebagai jawaban? Ini bekerja dengan sangat baik :)
Sampath

1
Menambahkan komentar sebagai jawaban @Sampath
Karthik Ganesan

Jawaban:


76

setel kode berikut sebelum kueri yang ingin Anda jalankan

context.Configuration.LazyLoadingEnabled = false;

40

Anda dapat menonaktifkan pemuatan lambat untuk kueri tertentu sebagai berikut:

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

Saya mungkin melewatkan sesuatu di sini, tetapi daripada mengubah konfigurasi setiap kali, mungkinkah pendekatan lain digunakan .Include()hanya pada kueri di mana Anda ingin memuat?

Misalkan kita memiliki Productkelas yang memiliki properti navigasi ke Colourkelas, Anda mungkin memuat Colouruntuk Productseperti ini -

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

1
Bagi saya ini adalah Jawaban terbaik di sini!
Ian

Ini gagal jika Anda hanya ingin memuat "produk", tanpa menyertakan apa pun.
Mackan

Jadi, Anda ingin mendapatkan 'Produk' tanpa objek terkait, atau 'Produk dengan semua objek terkait?'
Parrybird

1
Jawaban yang jauh lebih berguna. Ini mengontrol tabel sub-ordinat tertentu yang dimuat pada titik di mana kueri dibuat. Untuk masalah dunia nyata apa pun, ini harus menjadi jalan yang harus ditempuh.
Richard Petheram

5
Ini berguna dalam cara yang berbeda ... jika Anda melakukannya dengan cara ini, seseorang masih bisa mendapatkan pemuatan lambat untuk koleksi lain dari 'Produk'. Sebenarnya menonaktifkan pemuatan lambat lebih efektif untuk menjamin bahwa semua data yang diperlukan diambil sebelumnya dan menghindari terjadinya hambatan kinerja yang tersembunyi.
Doug

15

Buka properti diagram Anda dan temukan properti yang ditujukan untuk pemuatan lambat dan nonaktifkan.

Jika Anda menggunakan kode terlebih dahulu, buka area konfigurasi Anda dan nonaktifkan dari sana dengan:

this.Configuration.LazyLoadingEnabled = false;

6
Banyak orang mengunjungi pertanyaan ini dan saya ingin mengatakan, orang-orang JANGAN MENULIS KUERI TANPA MELIHAT RENCANA PELAKSANAAN. Selalu tahu apa yang dikirim kode Anda ke database atau Anda akan mengalami masalah kinerja. Anda dapat menggunakan linq pad atau alat lain untuk melihat kueri dan pemeriksaan sebenarnya.
Juan


3

Pendekatan lain untuk Versi EF lain (Entity Framework 5)

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

When contextis an ObjectContext, more or less deprecated dari wrapper-nya DbContext,.
Gert Arnold

2

Misalkan Anda memiliki ini:

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);
}

Anda masih akan mendapatkan pemuatan lambat, meskipun setelan eksplisit tidak ke. Cara mengatasinya mudah, ubah menjadi ini:

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();
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.