Entity Framework: Belirli bir sorgu için geç yükleme nasıl devre dışı bırakılır?


89

Entity Framework 6'da belirli bir sorgu için geç yüklemeyi devre dışı bırakmanın herhangi bir yolu var mı? Düzenli olarak kullanmak istiyorum ama bazen devre dışı bırakmak istiyorum. Onları tembel olarak yüklemek için sanal özellikleri kullanıyorum.


20
set context.Configuration.LazyLoadingEnabled = false; çalıştırmak istediğiniz sorgudan önce
Karthik Ganesan

5
Değeri this.Configuration.LazyLoadingEnabled = false;ayarlayıp sonra tekrar ayarlayabilir this.Configuration.LazyLoadingEnabled = true;misiniz? Ayrıca bu msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
teşekkür ederim @KarthikGanesan. Beklendiği gibi çalıştı.
Marco Alves

@KarthikGanesan Yorumunuzu cevap olarak verebilir misiniz? Gerçekten iyi çalışıyor :)
Sampath

1
Yorum yanıt olarak eklendi @Sampath
Karthik Ganesan

Yanıtlar:


76

yürütmek istediğiniz sorgudan önce aşağıdaki kodu ayarlayın

context.Configuration.LazyLoadingEnabled = false;

40

Aşağıdaki gibi belirli sorgu için Geç yüklemeyi devre dışı bırakabilirsiniz:

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

Burada bir şeyi kaçırıyor olabilirim, ancak her seferinde yapılandırmayı değiştirmek yerine, başka bir yaklaşım .Include(), yalnızca istekli yüklemek istediğiniz sorgularda kullanmak olabilir mi?

Biz olduğunu varsayalım Productbir bir navigasyon özelliğine sahiptir sınıf Colouryüklemek olabilir, sınıf Colourbir için Productböyle -

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

1
Benim için buradaki en iyi cevap bu!
Ian

Herhangi bir ekleme olmadan yalnızca "ürünleri" yüklemek istiyorsanız bu yetersiz kalır.
Mackan

Dolayısıyla, ilgili nesneleri olmadan 'Ürünler'i veya' ilgili tüm nesnelerin bulunduğu Ürünler'i almak istersiniz? '
Parrybird

1
Çok daha faydalı cevap. Bu, sorgunun oluşturulduğu noktada yüklenen belirli alt ordinat tablolarını kontrol eder. Herhangi bir gerçek dünya sorunu için, gidilecek yol bu olmalıdır.
Richard Petheram

5
Farklı bir şekilde kullanışlıdır ... Bu şekilde yaparsanız, "Ürünler" den başka bir koleksiyon için hala tembel yükleme yapılabilir. Aslında geç yüklemeyi devre dışı bırakmak, gereken tüm verilerin önceden getirilmesini garanti etmek ve gizli performans darboğazları oluşturmaktan kaçınmak için daha etkilidir.
Doug

15

Diyagram özelliklerinize gidin ve geç yükleme için atanmış bir özellik bulun ve devre dışı bırakın.

Önce kodu kullanıyorsanız, yapılandırma alanınıza gidin ve oradan şu şekilde devre dışı bırakın:

this.Configuration.LazyLoadingEnabled = false;

6
Pek çok insan bu soruyu ziyaret ediyor ve şunu söylemek istiyorum ki, insanlar YÜRÜTME PLANINA BAKMADAN SORU YAZMAYIN. Her zaman kodunuzun veritabanına ne gönderdiğini bilin yoksa performans sorunları yaşarsınız. Gerçek sorguyu görüntülemek ve kontrol etmek için linq pad veya diğer araçları kullanabilirsiniz.
Juan


3

Başka bir EF Sürümü için başka bir yaklaşım (Entity Framework 5)

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

Bir olduğunda context, ObjectContextsarmalayıcısının az çok kullanımdan kaldırılmış öncülü DbContext,.
Gert Arnold

2

Şuna sahip olduğunuzu varsayalım:

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

Açıkça belirtmeme ayarına rağmen yine de tembel yükleme alırsınız. Düzeltmek kolaydır, şuna değiştirin:

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.