Sanal anahtar kelimenin Entity Framework 4.1 POCO Kodunda ilk olarak ne gibi etkileri olabilir?


229

Does virtualEF Kod Birinci mülklerin kullanıldığında anahtar kelime bir etkisi var ?. Birisi tüm sonuçlarını farklı durumlarda tanımlayabilir mi?

Örneğin, tembel yüklemeyi kontrol edebileceğini biliyorum - sanal anahtar kelimesini bir ICollection / bire-çok ilişki özelliğinde kullanırsanız, varsayılan olarak tembel olarak yüklenir, oysa sanal anahtar kelimeyi dışarıda bırakırsanız, istekli olmak.

virtualAnahtar kelimelerin EF'de POCO varlıkları ile başka hangi etkileri olabilir ? virtualTüm özelliklerimde kullanmayı varsayılan mı yoksa kullanmamayı mı varsayılan yapmalıyım ?

Yanıtlar:


194

Şimdiye kadar, bu etkileri biliyorum.

  • Tembel Yükleme : virtualAksi takdirde, aksi belirtilmedikçe tüm ICollections tembel olarak yüklenecektir.
  • Daha verimli değişiklik takibi . Aşağıdaki gereksinimlerin tümünü karşılıyorsanız, değişiklik izlemeniz sanal özelliklerinizi bağlayarak daha verimli bir yöntem kullanabilir. Bağlantıdan:

    Değişiklik izleme proxy'lerini almak için temel kural, sınıfınızın herkese açık, soyut olmayan veya mühürsüz olması gerektiğidir. Sınıfınız, kalıcı olan tüm mülkler için genel sanal alıcılar / ayarlayıcılar da uygulamalıdır. Son olarak, koleksiyon tabanlı ilişki gezinme özelliklerini ICollection<T>yalnızca olduğu gibi bildirmeniz gerekir . Somut bir uygulama veya başka bir arayüz olamaz ICollection<T>(Ertelenmiş Yükleme proxy'sinden bir fark)

Bunu açıklayan bir başka yararlı bağlantı, MSDN'nin POCO Proxy Oluşturma Gereksinimleri'dir .


52
Mülkleri sanal yapmak için başka bir neden yoktur. Gezinme özellikleri, tembel yükleme için sanal olarak ve skaler özellikler değişiklik izleme için sanal olarak işaretlenir.
Ladislav Mrnka

10
navigasyon özellikleri nelerdir ve skaler özellikler nelerdir?
Abid Ali

9
@AbidAli: Bir navigasyon özelliğinin yabancı bir anahtar (varlık sınıfı türü) veya bire çok ilişkisi (ICollection <> türünde) olduğuna inanıyorum. Bir skaler özellik bir taban tipidir (int, dize, ..) veya bir ComplexType (sadece temel tiplerin bir yapısıdır).
Scott Stafford

2
" public virtual byte[] bigData { get; set; }" Tembel yükleme var mı?
AechoLiu

9
bayt [] hevesle yüklenecek, sadece yabancı anahtarlar tembel olabilir. Bu sütunu almak istemiyorsanız, asla tüm kaydı getirmeyin .Select(a=>new { fields you want }).
Scott Stafford

63

Bu sanal anahtar kelime, varlık çerçevesinden veri yükleme konusu ile ilgilidir (tembel yükleme, istekli yükleme ve açık yükleme).

Tembel yüklemeyle veri yüklemek istediğinizde sanal anahtar kelime kullanmalısınız .

tembel yükleme , bir varlığın veya varlık koleksiyonunun ilk kez veritabanına otomatik olarak yüklendiği işlemdir.

Örneğin, aşağıda tanımlanan Blog öğesi sınıfını kullanırken, Yayınlar gezinme özelliğine ilk kez erişildiğinde ilgili Yayınlar yüklenir:

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

Yayınlar koleksiyonunun tembel yüklemesi, Mesajlar özelliği sanal olmayan yapılarak kapatılabilir.

tembel yükleme kapalıysa, Mesajlar koleksiyonunun yüklenmesi yine de istekli yükleme (Dahil etme yöntemi kullanılarak) veya Açıkça ilgili varlıklar (Yükleme yöntemi kullanılarak) kullanılarak gerçekleştirilebilir.

Hevesle Yükleme:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

Açıkça Yükleniyor:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}

1
Sanal (tembel yükleme) kullanırken N + 1 sorununu nasıl önleyebilirim? Örneğin, context.Blogs.ToList (); tablolara katılmaz ve seçme sorgusunu blog sayısı kadar çalıştırır.
Uzman

1
@Expertwannabe Tembel yükleme kullansanız bile, yine de bir çağrı ile istekli yükleme isteğinde bulunabilirsiniz Include().
Monsignor
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.