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.

Marco Alves
sumber
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;
Karthik Ganesan
sumber
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;
        }
    }
}
William Ballesteros
sumber
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();
Parrybird
sumber
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;
Juan
sumber
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
12

Di EF Core: context.ChangeTracker.LazyLoadingEnabled = false;

Sesuai jawaban ini .

Matt Jenkins
sumber
3

Pendekatan lain untuk Versi EF lain (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 
fubo
sumber
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();
}
Kubu
sumber