26

ben yaşıyorum iki nesne sınıfları Varlık Framework Kod İlk Tembel Yükleme

public class User 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    // Navigation 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public Guid Id { get; set; } 

    // Navigation 
    public User User { get; set; } 
    public Guid User_Id { get; set; } 

    public string Name { get; set; } 
} 

i DataContext kullanarak bir kullanıcı yüklemek

i (bu ok) Ürünler boş olma listesini almak. i kullanıcıyı yüklediğinizde

i Ürünleri listeye "sanal" anahtar kelimesini eklerseniz

,

public virtual ICollection<Product> Products { get; set; } 

i de Ürünleri listesini almak.

Bu neden oluyor? Ben anladım düşünüyorum "sanal" anahtar kelime

(bir ifadeyi "Dahil" kullanarak) bu açık sürece varlıkları yüklenmemesi için kullanıldığını sanıyordum Sana bir özellik için Quiring konum tahmin tüm yanlış

+1

context.ContextOptions.LazyLoadingEnabled = false; bağlamı zorlamamak için LazyLoading –

+0

dbContext ile context.Configuration.LazyLoadingEnabled = false olur; "Virtual" kullanmadan – VivekDev

cevap

55

Bu yanlış

"sanal" anahtar kelime varlıkları yüklenmemesi için kullanılan

sürece

Tembel Birimler yükleniyor otomatik olarak yüklenecek anlamına gelir (bir ifadeyi "Dahil" kullanarak) bu açık İlk önce koleksiyona veya gezinme özelliğine erişirsiniz ve bu, her zaman üst nesne ile yüklenmiş gibi saydam olur.

Sorgulamak istediğiniz özellikleri belirttiğinizde "include" ifadesi istek üzerine yükleniyor.

virtual anahtar sözcüğünün varlığı sadece yükleme sırasında ilgili değildir. virtual anahtar sözcüğü, varlık çerçeve çalışma zamanının varlık sınıflarınız ve özellikleri için dinamik proxy'ler oluşturmasına ve bu sayede tembel yükleme desteğine izin verir. Sanal olmadan, tembel yükleme desteklenmez ve koleksiyon özelliklerinde boş kalırsınız.

Her halükarda "içerme" özelliğini kullanabilmeniz, ancak tembel yükleme olmadan, toplama ve gezinme özelliklerine erişmenin tek yolu budur.

+0

_ "Lazy Loading, topluluğa ilk eriştiğinizde bu varlıkların otomatik olarak yükleneceği anlamına gelir" _ Bu, user.Products özelliğine asla erişemediğim takdirde ürünlerin yüklenmeyeceği anlamına gelir, doğru mu? – Catalin

+0

@RaraituL: Sağ – abatishchev

+5

@RaraituL evet, bu doğru.Hata ayıklama yaparken, aslında ** ** özelliklerine erişirsiniz ve tembel yükleme desteklenirse yüklenir. Yani sql profiler veya veritabanı gibi gönderilen gerçek sorguları debug için araçları kullanabilirsiniz. – archil

4

içine ef bağlam olurken tembel yük için bir konu olan:

using (var db = new Context()) 
{ 
    var user = db.Users.Where(...); 

    var products = user.Products; // being loaded right away 
} 

deneyin bırakmak:

User user; 
using (var db = new Context()) 
{ 
    user = db.Users.Where(...); 

    // I guess you will need here: 
    // .Include(u => u.Products) 
} 
var products = user.Products; // what error will you get here? 
+0

: User user = db.Users.First(); hata ayıklama modunda, user.Products boştur. "sanal" anahtar kelimesini kullanarak: Kullanıcı kullanıcısı = db.Users.First(); hata ayıklama modunda, user.Products, Ürünlerin bir listesidir. – Catalin

+0

@RaraituL: Arşiv daha önce belirtildiği gibi, tempolu yüklemeyi mümkün kılmak için İlk Kod yaklaşımında sanal anahtar kelimeyi kullanmanız gerekir. Sonra onu açabilir veya kapatabilirsiniz. – abatishchev

+0

Ama bağlam "user.Products" önce "kapalı" idi, bu yüzden Tembel yükleme bağlam varsa nasıl çalışır? – Nerf

İlgili konular